Gradle打可運行Jar包(包含依賴第三方庫中的類)

使用Gradle來打Jar包,在引入Gradle的java插件後,直接就能實現java

在build.gradle文件中引入java插件shell

plugins {
    id 'java'
}

而後配置maifest主類bash

jar {
    manifest {
        attributes "Main-Class": "cn.buddie.GradleTest"
    }
}

最後執行jar任務就能打出來jar包了app

gradle jar

但這樣,打出來的Jar包中,只包含了本身編寫的代碼編譯成的Class文件。其它依賴的Jar包中的類,不在其中。gradle

解決方式有兩種。ui

一種是引用application插件,經過distTar或distZip打包。這樣生成的包裏不只包含了本身項目中寫的源碼編輯成的jar包,還包括gradle中配置依賴的jar包,同時還生成了shell和bat腳本,經過腳本,能夠直接運行咱們的程序。插件

另外一種,是在打jar包,直接依賴的第三方類庫中的類,一塊兒打包到咱們的jar中。code

具體以下:ip

jar {
    manifestContentCharset 'utf-8'
    metadataCharset 'utf-8'
    manifest {
        attributes "Main-Class": "cn.buddie.GradleTest"
    }
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

這樣打出來的jar包,可使用java -jar的方式運行utf-8

java -jar myapp.jar

若是領導說,你即須要提供單個的jar,又須要提供tar包,怎麼辦呢?由於修改了task jar,而task distTar是依賴於task jar。這樣的後果就是打出來的tar包中,已經包含了全部你依賴的第三方jar包,同時,你本身項目打出的jar包中,又包含了這些第三方jar包中的類。也就是全部第三方的類,都double了!

我這裏最終成功的解決方案爲:增長參數,讓task jar根據參數來決定是否將第三方依賴類打入本身的jar包。

jar {
    manifestContentCharset 'utf-8'
    metadataCharset 'utf-8'
    manifest {
        attributes "Main-Class": "cn.buddie.GradleTest"
    }
    if (project.hasProperty("allInOne")) {
        from {
            configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
        }
    }
}

這裏增長了一個「allInOne」的參數,若是不指定參數,就不會將第三方依賴類打入jar包。這樣在執行task distTar時,不指定參數,打出來的tar中,第三方依賴類就只有一份。

而在須要全部類在一個Jar包中的Jar文件時,可使用參數打包

gradle jar -PallInOne

這樣無論領導要什麼包,均可以在不作任何改動的狀況下,知足領導的需求

相關文章
相關標籤/搜索