在建立了一個實用的應用程式之後,我們可能想將其與他人分享。其中一種方式就是建立一個可以從網站上下載的二進位制檔案。
這篇教程描述瞭如何建立一個二進位制釋出版本,滿足以下需求:
- 二進位制釋出一定不能使用所謂的“fat jar”方式。換句話說,我們應用程式中的所有依賴一定不能被打包到該程式相同的jar包中。
- 二進位制釋出必須包含針對*nix和Windows作業系統的啟動副本。
- 二進位制釋出的根目錄必須包含許可證。
我們開始吧。
建立二進位制釋出檔案
Application外掛是一種Gradle外掛,讓我們可以執行、安裝應用程式並用非“fat jar”方式建立二進位制釋出版本。
還記得我們在上篇教程中提到的一個例子嗎?在它的build.gradle檔案中做一些相應的更改,就可以進行二進位制釋出了。
- 移除jar任務的配置。
- 為專案應用application外掛。
- 對應用程式的主類進行配置,設定mainClassName屬性。
在build.gradle檔案中作出以上更改後,結果如下(相關部分已經高亮):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apply plugin: 'application' apply plugin: 'java' repositories { mavenCentral() } dependencies { compile 'log4j:log4j:1.2.17' testCompile 'junit:junit:4.11' } mainClassName = 'net.petrikainulainen.gradle.HelloWorld' |
Application外掛在專案中新增了5個任務:
- run任務用以啟動應用程式。
- startScripts任務會在build/scripts目錄中建立啟動指令碼,這個任務所建立的啟動指令碼適用於Windows和*nix作業系統。
- installApp任務會在build/install/[project name]目錄中安裝應用程式。
- distZip任務用以建立二進位制釋出並將其打包為一個zip檔案。可以在build/distributions目錄下找到。
- distTar任務用以建立二進位制釋出並將其打包為一個tar檔案。可以在build/distributions目錄下找到。
我們可以通過在專案根目錄下執行以下命令:gradle distZip或gradle distTar 建立二進位制檔案。假設我們建立了一個打包為zip檔案的二進位制檔案,輸出如下:
1 2 3 4 5 6 7 8 9 10 11 |
> gradle distZip :compileJava :processResources :classes :jar :startScripts :distZip BUILD SUCCESSFUL Total time: 4.679 secs |
如果將application外掛建立的二進位制檔案解壓縮,可以得到以下目錄結構:
- bin目錄:包括啟動指令碼。
- lib目錄:包括應用程式的jar檔案以及它的依賴。
你可以閱讀Gradle Application外掛使用者指南(第45章)瞭解更多關於Application外掛資訊。
現在,我們可以建立一個幾乎能滿足所有需求的二進位制釋出了。不過,我們仍然需要在我們二進位制釋出的根目錄下新增應用程式的許可證。下面我就來看一下,如何做到這一點。
在二進位制釋出版本中新增應用程式許可證
- 建立一個任務,將許可證從專案的根目錄複製到build目錄下。
- 將許可證加入到所建立的二進位制釋出的根目錄下。
我們來仔細看一下這些步驟的詳情。
將許可證檔案複製到build目錄下
LICENSE檔案包含了我們應用程式的許可資訊,可以在專案的根目錄下找到它。
可以通過以下步驟將許可證檔案複製到build目錄下:
- 建立一個新的Copy任務,名為copyLicense。
- 使用CopySpec介面中的from()方法配置原始檔,將“LICENSE”作為引數呼叫。
- 使用CopySpec介面中into()方法配置target目錄,將$buildDir屬性作為引數呼叫。
在完成這些步驟以後,build.gradle檔案如下(相關部分已高亮):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apply plugin: 'application' apply plugin: 'java' repositories { mavenCentral() } dependencies { compile 'log4j:log4j:1.2.17' testCompile 'junit:junit:4.11' } mainClassName = 'net.petrikainulainen.gradle.HelloWorld' task copyLicense(type: Copy) { from "LICENSE" into "$buildDir" } |
現在,我們已經建立了一個任務,將LICENSE檔案從專案的根目錄複製到build目錄下。然而,當我們在專案根目錄下執行命令:gradle distZip,會看到以下輸出:
1 2 3 4 5 6 7 8 9 10 11 |
> gradle distZip :compileJava :processResources :classes :jar :startScripts :distZip BUILD SUCCESSFUL Total time: 4.679 secs |
換句話說,我們新的任務還沒有被引入。所以理所當然的,二進位制釋出中也沒有包含許可證。讓我們來修復這個問題。
將許可證檔案加入到二進位制釋出檔案中
我們可以通過以下步驟將許可證檔案加入到二進位制釋出檔案中:
- 將copyLicense任務從一個Copy任務改為正常的Gradle任務,只需在它的宣告中移除“(type: Copy)”字串。
- 按照以下步驟修改copyLicense任務
- 配置copyLicense任務輸出。建立一個新的檔案物件,指向build目錄的許可證檔案,並將其設定為outputs.file屬性值。
- 將許可證檔案從專案的根目錄複製到build目錄下。
- Application外掛在專案中設定了一個CopySpec屬性,名為applicationDistribution。我們可以使用這個屬性在已建立的二進位制檔案中加入許可證檔案,步驟如下:
- 使用CopySpec介面中的from()方法配置許可證檔案的位置,將copyLicense任務的輸出作為方法引數。
- 使用CopySpec介面中into()方法配置target目錄,將一個空的字串作為引數呼叫方法。
在實現了這些步驟以後,build.gradle檔案如下(相關部分已高亮):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
apply plugin: 'application' apply plugin: 'java' repositories { mavenCentral() } dependencies { compile 'log4j:log4j:1.2.17' testCompile 'junit:junit:4.11' } mainClassName = 'net.petrikainulainen.gradle.HelloWorld' task copyLicense { outputs.file new File("$buildDir/LICENSE") doLast { copy { from "LICENSE" into "$buildDir" } } } applicationDistribution.from(copyLicense) { into "" } |
在專案根目錄下執行命令gradle distZip時,會看到以下輸出:
1 2 3 4 5 6 7 8 9 10 11 12 |
> gradle distZip :copyLicense :compileJava :processResources :classes :jar :startScripts :distZip BUILD SUCCESSFUL Total time: 5.594 secs |
可以看到,copyLicense任務現在已經被引入了。我們可以對二進位制檔案解壓縮,在根目錄下就能發現LICENSE檔案了。
最後,我們對這篇教程中所學到的東西進行總結。
總結
這篇教程為我們教授了三方面內容:
- 學會使用application外掛建立一個二進位制釋出。
- 學會使用Copy任務將一個檔案從源目錄複製到目標目錄。
- 學會如果將檔案加入到由Application外掛建立的二進位制釋出檔案中。
如果你想執行本教程中的示例程式,請從Github中獲取。