<NO.2>自從用了Android Studio渠鸽,Gradle是必須學(xué)了...

這篇教程的主要內(nèi)容是講解如何用Gradle編譯和打包一個簡單的Java項目读虏。

該Java項目只有一個需求:我們的構(gòu)建腳本必須創(chuàng)建一個可執(zhí)行的Jar文件,換句話說墨缘,我們必須能夠使用命令java -jar jarfile.jar 來運行我們的程序星虹。我們來看一下如何滿足這個需求零抬。

創(chuàng)建一個Java項目

我們可以使用Java插件(譯注:關(guān)于Gradle插件的定義,請查看第一篇教程)來創(chuàng)建一個Java項目搁凸,為了做到這點媚值,我們需要把下面這段語句加入到build.gradle文件中:

apply plugin: 'java'

就是這樣,現(xiàn)在我們已經(jīng)創(chuàng)建了一個Java項目护糖。Java插件會在我們的構(gòu)建中添加一些新的約定(如默認(rèn)的項目結(jié)構(gòu))褥芒,新的任務(wù),和新的屬性嫡良。

讓我們來快速地看一下默認(rèn)的項目結(jié)構(gòu)锰扶。

Java項目結(jié)構(gòu)

默認(rèn)的項目結(jié)構(gòu)如下:

src/main/java目錄包含了項目的源代碼。

src/main/resources目錄包含了項目的資源(如屬性文件)寝受。

src/test/java目錄包含了測試類坷牛。

src/test/resources目錄包含了測試資源。所有我們構(gòu)建生成的文件都會在build目錄下被創(chuàng)建很澄,這個目錄涵蓋了以下的子目錄京闰,這些子目錄我們會在這篇教程中提到,另外還有一些子目錄我們會放在以后講解甩苛。

classes目錄包含編譯過的.class文件蹂楣。

libs目錄包含構(gòu)建生成的jar或war文件。

為構(gòu)建加入一個主類(main class)

讓我們創(chuàng)建一個簡單的主類讯蒲,在這個類中會打印一個“Hello world”然后System.out出來痊土。這個HelloWorld類的源代碼如下:

package net.petrikainulainen.gradle;

public class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello World!");

}

}

HelloWorld類存放在src/main/java/net/petrikainulainen/gradle目錄

這很好,然而墨林,我們還需要編譯和打包我們的項目赁酝,不是嗎?我們先看一下這個Java工程中的任務(wù)旭等。

Java工程中的任務(wù)

Java插件在我們的構(gòu)建中加入了很多任務(wù)酌呆,我們這篇教程涉及到的任務(wù)如下:

assemble任務(wù)會編譯程序中的源代碼,并打包生成Jar文件搔耕,這個任務(wù)不執(zhí)行單元測試隙袁。

build任務(wù)會執(zhí)行一個完整的項目構(gòu)建。

clean任務(wù)會刪除構(gòu)建目錄度迂。

compileJava任務(wù)會編譯程序中的源代碼藤乙。

我們還可以執(zhí)行以下命令得到一個可運行任務(wù)及其描述的完整列表

> gradle tasks

:tasks

------------------------------------------------------------

All tasks runnable from root project

------------------------------------------------------------

Build tasks

-----------

assemble - Assembles the outputs of this project.

build - Assembles and tests this project.

buildDependents - Assembles and tests this project and all projects that depend on it.

buildNeeded - Assembles and tests this project and all projects it depends on.

classes - Assembles classes 'main'.

clean - Deletes the build directory.

jar - Assembles a jar archive containing the main classes.

testClasses - Assembles classes 'test'.

Build Setup tasks

-----------------

init - Initializes a new Gradle build. [incubating]

wrapper - Generates Gradle wrapper files. [incubating]

Documentation tasks

-------------------

javadoc - Generates Javadoc API documentation for the main source code.

Help tasks

----------

dependencies - Displays all dependencies declared in root project 'first-java-project'.

dependencyInsight - Displays the insight into a specific dependency in root project 'first-java-project'.

help - Displays a help message

projects - Displays the sub-projects of root project 'first-java-project'.

properties - Displays the properties of root project 'first-java-project'.

tasks - Displays the tasks runnable from root project 'first-java-project'.

Verification tasks

------------------

check - Runs all checks.

test - Runs the unit tests.

Rules

-----

Pattern: build: Assembles the artifacts of a configuration.

Pattern: upload: Assembles and uploads the artifacts belonging to a configuration.

Pattern: clean: Cleans the output files of a task.

To see all tasks and more detail, run with --all.

BUILD SUCCESSFUL

Total time: 2.792 secs

我們繼續(xù)猜揪,下面要講怎樣打包我們的項目惭墓。

打包我們的項目

我們可以通過使用兩個不同的任務(wù)來打包項目。

如果我們在命令提示符中執(zhí)行命令gradle assemble而姐,我們可以看到以下輸出:

> gradle assemble

:compileJava

:processResources

:classes

:jar

:assemble

BUILD SUCCESSFUL

Total time: 3.163 secs

如果我們在命令提示符中執(zhí)行命令gradle build腊凶,我們可以看到以下輸出:

> gradle build

:compileJava

:processResources

:classes

:jar

:assemble

:compileTestJava

:processTestResources

:testClasses

:test

:check

:build

BUILD SUCCESSFUL

Total time: 3.01 secs

這些命令的輸出表明了它們的區(qū)別:

assemble任務(wù)僅僅執(zhí)行項目打包所必須的任務(wù)集。

build任務(wù)執(zhí)行項目打包所必須的任務(wù)集,以及執(zhí)行自動化測試钧萍。這兩個命令都會在build/libs目錄中創(chuàng)建一個file-java-project.jar文件褐缠。默認(rèn)創(chuàng)建的Jar文件名稱是由這個模版決定的:[projectname].jar,此外风瘦,項目的默認(rèn)名稱和其所處的目錄名稱是一致的队魏。因此如果你的項目目錄名稱是first-java-project,那么創(chuàng)建的Jar文件名稱就是first-java-project.jar万搔。

現(xiàn)在胡桨,我們嘗試使用以下命令運行我們的程序:

java -jar first-java-project.jar

我們可以看到以下輸出:

> java -jar first-java.project.jar

No main manifest attribute, in first-java-project.jar

問題出在,我們沒有在manifest文件中配置Jar文件的主類瞬雹,讓我們繼續(xù)看看怎樣解決這個問題昧谊。

配置Jar文件的主類

Java插件在我們的項目中加入了一個Jar任務(wù),每一個Jar對象都一個manifest屬性酗捌,這個屬性是Manifest的一個實例呢诬。

我們可以對生成的Jar文件的主類進(jìn)行配置,使用Manifest接口的attributes()方法胖缤。換句話說尚镰,我們可以使用一個包含鍵值對的map結(jié)構(gòu)指定加入到manifest文件的屬性集。

我們能夠通過設(shè)置Main-Class屬性的值草姻,指定我們程序的入口點钓猬。在我們對build.gradle文件進(jìn)行必要的改動后,代碼如下:

apply plugin: 'java'

jar {

manifest {

attributes 'Main-Class': 'net.petrikainulainen.gradle.HelloWorld'

}

}

(JavaSE教程提供了關(guān)于manifest文件的更多信息撩独。)

在我們執(zhí)行g(shù)radle assemble或gradle build命令生成一個新的jar文件之后敞曹,我們可以執(zhí)行以下命令運行jar文件:

java -jar first-java-project.jar

當(dāng)我們運行程序時,System.out會打印出以下信息:

> java -jar first-java-project.jar

Hello World!

這就是我們今天所有的內(nèi)容综膀,我們看一下我們學(xué)到了什么澳迫。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市剧劝,隨后出現(xiàn)的幾起案子橄登,更是在濱河造成了極大的恐慌,老刑警劉巖讥此,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拢锹,死亡現(xiàn)場離奇詭異,居然都是意外死亡萄喳,警方通過查閱死者的電腦和手機卒稳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來他巨,“玉大人充坑,你說我怎么就攤上這事减江。” “怎么了捻爷?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵辈灼,是天一觀的道長。 經(jīng)常有香客問我也榄,道長巡莹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任甜紫,我火速辦了婚禮榕莺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棵介。我一直安慰自己钉鸯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布邮辽。 她就那樣靜靜地躺著唠雕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吨述。 梳的紋絲不亂的頭發(fā)上岩睁,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音揣云,去河邊找鬼捕儒。 笑死,一個胖子當(dāng)著我的面吹牛邓夕,可吹牛的內(nèi)容都是我干的刘莹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼焚刚,長吁一口氣:“原來是場噩夢啊……” “哼点弯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起矿咕,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤抢肛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碳柱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捡絮,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年莲镣,在試婚紗的時候發(fā)現(xiàn)自己被綠了福稳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡剥悟,死狀恐怖灵寺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情区岗,我是刑警寧澤略板,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站慈缔,受9級特大地震影響叮称,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜藐鹤,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一瓤檐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娱节,春花似錦挠蛉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稠歉,卻和暖如春掰担,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怒炸。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工带饱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阅羹。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓勺疼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捏鱼。 傳聞我的和親對象是個殘疾皇子恢口,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 盡管我們可以僅使用單個組件來創(chuàng)建可工作的應(yīng)用程序耕肩,但有時候更廣泛的做法是將應(yīng)用程序劃分為多個更小的模塊。 由于這是...
    XLsn0w閱讀 402評論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理问潭,服務(wù)發(fā)現(xiàn)猿诸,斷路器,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 在創(chuàng)建了一個實用的應(yīng)用程序之后,我們可能想將其與他人分享灾茁。其中一種方式就是創(chuàng)建一個可以從網(wǎng)站上下載的二進(jìn)制文件窜觉。 ...
    XLsn0w閱讀 301評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,081評論 25 707
  • 介紹 參數(shù) -l 強制scp命令使用協(xié)議ssh1-2 強制scp命令使用協(xié)議ssh2-4 強制scp命令只使用ip...
    程序員驛站閱讀 322評論 0 0