這幾天目前正在作的這個項目差很少編碼已經大體的完成了,須要的就是把項目打包成jar包,研究了幾天如何打包jar,遇到了不少問題,最終打包成功,下面分享給你們。html
由於本人用的開發環境是IntelliJ IDEA,開始的時候研究了一下利用這個開發工具進行打包java
首先按F4或者點擊IDEA右上角這地方mysql
進入項目結構管理器android
選擇這裏面的Artifacts。開始我徹底不知道Artifacts是什麼東西,後來查閱了點資料:Artifacts是maven中的一個概念,表示某個module要如何打包,例如war exploded、war、jar、ear等等這種打包形式;意思我理解的就是Artifacts就是告訴咱們的程序因該如何打包這個項目。git
以後新建一個Artifactsgithub
這有兩個選項選擇第二個,從模塊中引入,點擊進去後會有一些設置,以下:web
module是你須要打成jar包的項目redis
MainClass是運行的主函數,若是不須要運行則能夠不選擇spring
jar files from libraries是項目打包的方式,下面選項大體的含義:sql
1:extract to the target jar:把全部文件倒入進一個jar包裏
2:copy to the。。。。:把項目的依賴包導出和項目一個目錄,經過MANIFEST.MF文件來引用jar包。
這裏若是你的項目須要打成一個可運行的jar包推薦第二種,反之第一種。
設置完以後,就會新建一個xxx:jar,並進入進入xxx:jar的編輯頁面
在咱們須要進行一個輸出目錄佈局的設置,咱們能夠看到,已經編譯好的項目的jar文件(個人是eachend.jar)和其餘導入的jar包混到一塊兒的,很雜,我是點擊output layout下最左邊的文件夾圖標新建了一個lib文件,把其餘jar包拖拽進來(建議,也能夠直接點OK完成)
可是咱們這樣作的話依賴的jar包的目錄就會產生變化,這時候咱們須要選中咱們項目,在下方而後修改MANIFEST.MF中的Class Path
修改爲OK
到了這一步後Artifacts是寫好了,保存以後就能夠用來生成jar文件
點擊build Artifacts後選擇你剛剛生成的artifacts
build後就會在out的目錄下生成對應的jar文件
最後進入項目目錄 輸入命令java -jar XXX.jar 就能夠跑起來了 以下
本覺得項目打成jar包而且能夠完美運行了後,這事就差很少完了,但是項目組長說:你這樣打包是能夠,可是若是其餘人用Eclipes來開發的話,就無論用了。。。。。。哎,好不容易搞出來的一個方法被pass掉了,無奈之下就只有另換方法。
由於項目我是用的gradle構建的,第一時間想起了用gradle打包。
利用gradle進行打包其實很是很是簡單,可是由於我日常只是簡單用它來導包,以及構建項目,它的基本的一些東西不是很清楚,因此走了些彎路花了大半天的時間才搞出來,因此說有時候須要瞭解一下你所用的東西的一些基礎和原理。
在build,gradle中首先須要加上
apply plugin: 'java' apply plugin: 'idea'
來定義你本身項目使用的插件,apply plugin: 'idea'用於把項目構建成idea項目,apply plugin: 'java'用於添加Java插件,以及一些內置任務,打包jar就要用到這裏的插件。
version = '1.0' repositories { mavenCentral() }
這裏用來聲明版本號以及添加maven中心倉庫地址
dependencies { compile 。。。。。。。 }
這裏來添加項目所須要的依賴包
jar { String someString = '' configurations.runtime.each {someString = someString + " lib\\"+it.name} //遍歷項目的全部依賴的jar包賦值給變量someString manifest { attributes 'Main-Class': 'com.each.dubboMainEnd' attributes 'Class-Path': someString } }
打包的時候,這個地方很重要,用來設置jar文件的相關屬性,這個地方把我坑了有點久,最後補了下gradle的基礎知識,就搞出來了,這篇博客寫gradle基礎寫的還能夠,推薦給你們看看http://www.open-open.com/lib/view/open1447139848053.html
首先這定義了一個someString用來存放依賴包的信息,經過configurations.runtime拿到全部的運行時的依賴jar包,而後.each遍歷他,經過it.name獲取到每一個的jar包的name,賦值。
manifest便是編譯完成後生成jar包中的MANIFEST.MF配置信息
task copyJar(type:Copy){ from configurations.runtime into ('build/libs/lib') } task release(type: Copy,dependsOn: [build,copyJar]) { // from 'conf' // into ('build/libs/eachend/conf') }
創建函數copyJar 用於把依賴的jar複製到對應的目錄下。
函數release便是咱們打包的時候的執行的函數,dependsOn[build,copyJar]這裏會讓執行relese函數的時候先執行build(系統自帶的函數) 和copyJar
最後經過gradle release命令進行打包
打包成功!
目錄以下:
cmd下進入對應目錄運行 java -jar XXX.jar
運行成功!
build.gradle 完整源碼:
apply plugin: 'java' apply plugin: 'idea' version = '1.0' repositories { mavenCentral() } project.ext { springVersion = '4.0.4.RELEASE' minaVersion = '2.0.13' } dependencies { compile('com.alibaba:dubbo:2.4.9') { exclude group: 'org.springframework', module: 'spring' } compile( "org.apache.zookeeper:zookeeper:3.3.6") { exclude group: 'javax.jms', module: 'jms' exclude group: 'com.sun.jmx', module: 'jmxri' exclude group: 'com.sun.jdmk', module: 'jmxtools' } compile( "com.github.sgroschupf:zkclient:0.1") { exclude group: 'javax.jms', module: 'jms' exclude group: 'com.sun.jmx', module: 'jmxri' exclude group: 'com.sun.jdmk', module: 'jmxtools' } compile "org.springframework:spring-webmvc:$springVersion", "org.springframework:spring-web:$springVersion", "org.springframework:spring-tx:$springVersion", "org.springframework:spring-orm:$springVersion", "org.springframework:spring-jdbc:$springVersion", "org.springframework:spring-expression:$springVersion", "org.springframework:spring-core:$springVersion", "org.springframework:spring-context:$springVersion", "org.springframework:spring-beans:$springVersion", "org.springframework:spring-aop:$springVersion", "org.apache.mina:mina-http:$minaVersion", "org.apache.mina:mina-core:$minaVersion", "org.hibernate.common:hibernate-commons-annotations:4.0.1.Final", "org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final", "org.hibernate:hibernate-core:4.1.0.Final", "com.alibaba:fastjson:1.1.33.android", "com.google.code.gson:gson:2.2.4", "org.jboss.netty:netty:3.2.5.Final", "mysql:mysql-connector-java:5.1.10", // "org.apache.zookeeper:zookeeper:3.3.6", // "com.github.sgroschupf:zkclient:0.1", "cn.jpush.api:jpush-client:3.2.9", "redis.clients:jedis:2.6.1", "javax.servlet:javax.servlet-api:3.1.0", "net.sf.ezmorph:ezmorph:1.0.4", "com.google.collections:google-collections:1.0", "org.json:json:20090211", "net.sf.json-lib:json-lib:2.2.1:jdk15", fileTree(dir: 'lib', include: '*.jar') } jar { String someString = '' configurations.runtime.each {someString = someString + " lib\\"+it.name} manifest { attributes 'Main-Class': 'com.each.dubboMainEnd' attributes 'Class-Path': someString } } //清除上次的編譯過的文件 task clearPj(type:Delete){ delete 'build','target' } task copyJar(type:Copy){ from configurations.runtime into ('build/libs/lib') } //把JAR複製到目標目錄 task release(type: Copy,dependsOn: [build,copyJar]) { // from 'conf' // into ('build/libs/eachend/conf') // 目標位置 }
經過這個需求,我學到了不少:gradle的基礎語法,jar包是怎麼運行的,打包jar等,有事走些彎路並非壞事,這會讓你把你本身的不足的知識學到。說說這打包,我的推薦第二種兩種方式,對於不怎麼了解gradle的同窗們能夠試試第一種。