Gradle入门:我们的第一个Java项目
這篇博客文章描述了如何使用Gradle編譯和打包一個(gè)簡(jiǎn)單的Java項(xiàng)目。
我們的Java項(xiàng)目只有一個(gè)要求:
我們的構(gòu)建腳本必須創(chuàng)建一個(gè)可執(zhí)行的jar文件。 換句話說,我們必須能夠使用以下命令運(yùn)行程序:
讓我們找出如何滿足這一要求。
創(chuàng)建一個(gè)Java項(xiàng)目
我們可以通過應(yīng)用Java插件來創(chuàng)建Java項(xiàng)目。 我們可以通過在build.gradle文件中添加以下行來實(shí)現(xiàn) :
apply plugin: 'java'這就對(duì)了。 現(xiàn)在,我們已經(jīng)創(chuàng)建了一個(gè)Java項(xiàng)目。
Java插件為我們的構(gòu)建添加了新的約定(例如,默認(rèn)的項(xiàng)目布局), 新的任務(wù)和新的屬性 。
讓我們繼續(xù)前進(jìn),快速瀏覽一下默認(rèn)的項(xiàng)目布局。
Java項(xiàng)目的項(xiàng)目布局
Java項(xiàng)目的默認(rèn)項(xiàng)目布局如下:
- src / main / java目錄包含我們項(xiàng)目的源代碼。
- src / main / resources目錄包含我們項(xiàng)目的資源(例如屬性文件)。
- src / test / java目錄包含測(cè)試類。
- src / test / resources目錄包含測(cè)試資源。
我們構(gòu)建的所有輸出文件都在構(gòu)建目錄下創(chuàng)建 。 該目錄包含與該博客文章相關(guān)的以下子目錄(也有其他子目錄,但以后我們將討論它們):
- classes目錄包含已編譯的.class文件。
- libs目錄包含由構(gòu)建創(chuàng)建的jar或war文件。
讓我們繼續(xù)并將簡(jiǎn)單的主類添加到我們的項(xiàng)目中。
在我們的版本中添加主類
讓我們創(chuàng)建一個(gè)簡(jiǎn)單的主類,該主類將單詞“ 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目錄。
那很好。 但是,我們?nèi)匀槐仨毦幾g和打包我們的項(xiàng)目。 讓我們繼續(xù)看一下Java項(xiàng)目的任務(wù)。
Java項(xiàng)目的任務(wù)
Java插件向我們的構(gòu)建中添加了許多任務(wù),但是與此博客文章相關(guān)的任務(wù)是:
- 組裝任務(wù)將編譯應(yīng)用程序的源代碼并將其打包到j(luò)ar文件中。 此任務(wù)不會(huì)運(yùn)行單元測(cè)試。
- 構(gòu)建任務(wù)執(zhí)行項(xiàng)目的完整構(gòu)建。
- clean任務(wù)刪除構(gòu)建目錄。
- compileJava任務(wù)編譯我們應(yīng)用程序的源代碼。
我們還可以通過在命令提示符處運(yùn)行以下命令來獲取可運(yùn)行任務(wù)及其描述的完整列表:
gradle tasks這是獲得我們的項(xiàng)目的簡(jiǎn)要概述的一種好方法,而無需閱讀構(gòu)建腳本。 如果在示例項(xiàng)目的根目錄中運(yùn)行此命令,則會(huì)看到以下輸出:
> 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<ConfigurationName>: Assembles the artifacts of a configuration. Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration. Pattern: clean<TaskName>: Cleans the output files of a task.To see all tasks and more detail, run with --all.BUILD SUCCESSFULTotal time: 2.792 secs讓我們繼續(xù)前進(jìn),了解如何打包Java項(xiàng)目。
打包我們的Java項(xiàng)目
我們可以使用兩個(gè)不同的任務(wù)來打包應(yīng)用程序:
如果在命令提示符處運(yùn)行命令gradle組裝 ,我們將看到以下輸出:
> gradle assemble :compileJava :processResources :classes :jar :assembleBUILD SUCCESSFULTotal time: 3.163 secs如果在命令提示符處運(yùn)行命令gradle build , 則將看到以下輸出:
> gradle build :compileJava :processResources :classes :jar :assemble :compileTestJava :processTestResources :testClasses :test :check :buildBUILD SUCCESSFULTotal time: 3.01 secs這些命令的輸出表明,這些任務(wù)的不同之處在于:
- 組裝任務(wù)僅運(yùn)行打包我們的應(yīng)用程序所需的任務(wù)。
- 構(gòu)建任務(wù)運(yùn)行打包我們的應(yīng)用程序所需的任務(wù),并運(yùn)行自動(dòng)化測(cè)試。
這兩個(gè)命令都將first-java-project.jar文件創(chuàng)建到build / libs目錄。
通過使用以下模板創(chuàng)建創(chuàng)建的jar文件的默認(rèn)名稱: [項(xiàng)目名稱] .jar ,并且該項(xiàng)目的默認(rèn)名稱與創(chuàng)建它的目錄的名稱相同。 因?yàn)槲覀兊捻?xiàng)目目錄的名稱是first-java-project ,所以創(chuàng)建的jar的名稱是first-java-project.jar 。
現(xiàn)在,我們可以嘗試使用以下命令來運(yùn)行我們的應(yīng)用程序:
java -jar first-java-project.jar執(zhí)行此操作時(shí),將看到以下輸出:
> java -jar first-java.project.jar No main manifest attribute, in first-java-project.jar問題是我們尚未在清單文件中配置jar文件的主類。 讓我們找出如何解決這個(gè)問題。
配置jar文件的主類
Java插件向我們的項(xiàng)目添加了一個(gè)jar任務(wù) ,每個(gè)jar對(duì)象都有一個(gè)manifest屬性,該屬性是Manifest的一個(gè)實(shí)例。
我們可以使用Manifest接口的attribute()方法配置創(chuàng)建的jar文件的主類。 換句話說,我們可以使用包含鍵值對(duì)的映射來指定添加到清單文件的屬性。
我們可以通過設(shè)置Main-Class屬性的值來設(shè)置應(yīng)用程序的入口點(diǎn)。 在對(duì)build.gradle文件進(jìn)行了必要的更改之后,其源代碼如下所示(相關(guān)部分已突出顯示):
apply plugin: 'java'jar {manifest {attributes 'Main-Class': 'net.petrikainulainen.gradle.HelloWorld'} }Java SE教程提供了有關(guān)清單文件的更多信息 。
通過運(yùn)行g(shù)radle assemble或gradle build命令創(chuàng)建新的jar文件之后,可以使用以下命令運(yùn)行jar文件:
java -jar first-java-project.jar當(dāng)我們運(yùn)行應(yīng)用程序時(shí),以下文本將打印到System.out :
> java -jar first-java-project.jar Hello World!今天就這些。 讓我們找出從這篇博客文章中學(xué)到的知識(shí)。
摘要
現(xiàn)在,我們使用Gradle創(chuàng)建了一個(gè)簡(jiǎn)單的Java項(xiàng)目。 這篇博客文章教會(huì)了我們四件事:
- 我們知道可以通過應(yīng)用Gradle Java插件來創(chuàng)建Java項(xiàng)目。
- 我們了解到Java項(xiàng)目的默認(rèn)目錄布局與Maven項(xiàng)目的默認(rèn)目錄布局相同。
- 我們了解到,可以從構(gòu)建目錄中找到由構(gòu)建生成的所有輸出文件。
- 我們學(xué)習(xí)了如何自定義添加到清單文件的屬性。
PS此博客文章的示例項(xiàng)目可在Github上獲得 。
翻譯自: https://www.javacodegeeks.com/2014/06/getting-started-with-gradle-our-first-java-project.html
總結(jié)
以上是生活随笔為你收集整理的Gradle入门:我们的第一个Java项目的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenAI将于11月6日举办首届开发者
- 下一篇: Spring4:具有Java 8 Dat