最全面的使用idea和gradle把java項目打包成jar的方法

前言

        這幾天目前正在作的這個項目差很少編碼已經大體的完成了,須要的就是把項目打包成jar包,研究了幾天如何打包jar,遇到了不少問題,最終打包成功,下面分享給你們。html

一 Idea打包jar

        由於本人用的開發環境是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  就能夠跑起來了  以下

 

二 gradle打包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的同窗們能夠試試第一種。

相關文章
相關標籤/搜索