構建Gradle范例項目之構建Java項目

jopen 9年前發布 | 12K 次閱讀 Gradle 項目構建

Gradle插件通過引入特定領域的約定和任務來構建你的項目。Java插件是Gradle自身裝載的一個插件。Java插件提供的基本功能遠比源代碼編譯和打包多。它為你的項目建立了一個標準的項目布局,并確保有意義,有順序地執行任務。現在,為你的項目創建一個構建腳本并使用Java插件。

使用Java插件

每個Gradle項目都是以創建名字為build.gradle的文件開始的。創建這個文件,然后像下面這樣告訴它要使用Java插件

apply plugin: 'java'

一行代碼足夠構建你的Java代碼,但是Gradle怎么知道去哪里找源文件呢?Java插件引入的約定之一就是源代碼的位置。在默認情況下,插件會到 src/main/java 目錄下查找。

自動化生成項目結構

但是,我們要手工來創建build.gradle文件與源代碼目錄嗎?顯示不是,gradle提供了初始化項目目錄的命令init

gradle init --type [java-library | scala-library | groovy-library | basic | pom]

type參數當前只支持以下類型:

  • basic:缺省值,僅僅為我們創建好構建腳本

    </li>

  • pom:將一個maven構建的項目轉換成一個gradle構建的項目。如果pom.xml存在,這個類型值會被自動指定。

    </li>

  • java-library:初始化創建一個gradle構建的java項目

    </li>

  • scala-library:初始化創建一個gradle構建的scala項目

    </li>

  • groovy-library:初始化創建一個gradle構建的groovy項目

    </li> </ul>

    這里以創建java項目為例:

    $ gradle init --type java-library

    構建Gradle范例項目之構建Java項目

    構建Gradle范例項目之構建Java項目

    上圖顯示,gradle構建的完整的java項目結構就完成了。注意,你們還帶了包裝器的,后面再講。

    構建項目

    你可以開始構建項目了。java插件提供的一個任務叫作build。這個build任務會以正確的順序編譯你的源代碼,運行測試,組裝JAR文件。運行gradle build命令,你應該可以得到類似于下面的輸出:

    $ gradle build

    構建Gradle范例項目之構建Java項目

    每一行輸出都代表著java插件提供的一個可執行任務。你也許注意到某些任務被標記為 UP-TO-DATE 消息。這意味著這個任務被跳過了。Gradle的增量式構建支持自動鑒別不需要被運行的任務。特別是在大型的企業級項目中,這個特性是節省時間的好幫手。在上面的例子中,你可以看到有測試任務執行,測試源代碼默認的位置為:src/test/java

    運行構建后,在項目的根目錄下,你會看到有一個build目錄,里面包含了構建運行的所有輸出,包括class文件測試報告JAR文件,還有一些像清單(manifest)一樣的對構建有用的臨時文件。:1. 構建輸出目錄的名字是可配置的屬性。2. JAR文件的名字是繼承自項目的名字。

    運行項目

    運行一個Java應用程序是非常簡單的。因為項目是通過命令:

    $ gradle init --type java-library

    創建的,會產生一個java源文件類的示例和一個java測試類的示例,但并沒有帶有main函數入口的java類。這里我們創建一個測試用:

    public class Main {
      public static final void main(String[] args){
        System.out.println("test File");
      }
    }

    再重新構建一下:

    $ gradle build

    下面,我們來運行項目,執行下面的命令:

    $ java -cp build/classes/main/ Main

    構建Gradle范例項目之構建Java項目

    就是這樣——使用Gradle,你不費吹灰之力就實現和構建了一個Java應用。只要使用標準約定,你所需要做的只是一行腳本

    定制你的項目

    Java插件是一個很靈活的框架。它會給項目的許多方面設置有意義的默認值,比如項目結構。如果你看待開發世界的方式不同,Gradle給予你定制這些約定的選項。如何知道什么可配置?有一個好地方,就是Gradle構語言指導:http://www.gradle.org/docs/current/dsl/ 還記得前面講的命令行選項 properties 嗎?  運行:

    $ gradle properties

      它會給你一個可配置標準和插件屬性的列表,同時還會顯示它們的默認值。你可以通過擴展初始構建腳本來定制你的項目。

    ?修改項目和插件屬性?

    下面的例子中,你將給項目指定一個版本號,并且指定Java源代碼的兼容性。另外,之前你通過java命令運行應用,通過classpath命令行選項 -cp build/classes/main 告訴Java運行時去哪里找class。為了能夠從JAR文件啟動應用,清單文件MANIFEST.MF需要包含信息頭Main-Class。示例(用前面gradle init --type java-library命令生成的build.gradle,在上面添 加配置項):

    /
      This build file was auto generated by running the Gradle 'init' task
      by 'fuhd' at '15-10-22 下午8:14' with Gradle 2.7
     
      This generated file contains a sample Java project to get you started.
      For more details take a look at the Java Quickstart chapter in the Gradle
      user guide available at https://docs.gradle.org/2.7/userguide/tutorial_java_projects.html
     /

    // Apply the java plugin to add support for Java apply plugin: 'java'

    version = 0.1 sourceCompatibility = 1.8 jar{   manifest{     attributes 'Main-Class':'Main'   } }

    // In this section you declare where to find the dependencies of your project repositories {     // Use 'jcenter' for resolving your dependencies.     // You can declare any Maven/Ivy/file repository here.     jcenter() }

    // In this section you declare the dependencies for your production and test code dependencies {     // The production code uses the SLF4J logging API at compile time     compile 'org.slf4j:slf4j-api:1.7.12'

        // Declare the dependency for your favourite test framework you want to use in your tests.     // TestNG is also supported by the Gradle Test task. Just change the     // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add     // 'test.useTestNG()' to your build script.     testCompile 'junit:junit:4.12' }</pre>

    然后運行:

    $ gradle build

    你會看到版本號添加到了JAR文件的名字中。現在名字是abc-0.1.jar。現在生成的JAR文件包含了主類頭屬性,你可以通過下面這條命令運行應用:

    $ java -jar build/libs/abc-0.1.jar

    改造遺留項目

    和一個遺留系統集成,遷移已有項目的技術棧,或者堅持內部標準或者限制,實在太常見了。構建工具必須足夠靈活,可以通過改變默認配置來適應來自外部的限制

    讓我們假設你是在一個完全不一樣的目錄結構下開始這個項目的。你需要把源代碼放置在src目錄下,而不是 src/main/java 。同樣的道理,也適用于改變默認的測試代碼目錄。另外,你想要讓Gradle將輸出結果放置在out目錄下, 而不是build。下面代碼展示了如何讓你的構建適應一個定制的項目結構:

    /
      This build file was auto generated by running the Gradle 'init' task
      by 'fuhd' at '15-10-22 下午8:14' with Gradle 2.7
     
      This generated file contains a sample Java project to get you started.
      For more details take a look at the Java Quickstart chapter in the Gradle
      user guide available at https://docs.gradle.org/2.7/userguide/tutorial_java_projects.html
     /

    // Apply the java plugin to add support for Java apply plugin: 'java'

    version = 0.1 sourceCompatibility = 1.8 jar{   manifest{     attributes 'Main-Class':'Main'   } }

    sourceSets{   main{     java{       srcDirs = ['src']            //用不同目錄的列表代替約定的源代碼     }   }   test{     java{       srcDirs = ['test']           //用不同目錄的列表代替約定的測試代碼目錄     }   } }

    buildDir = 'out'                   //改變項目輸出屬性(路徑)到out目錄

    // In this section you declare where to find the dependencies of your project repositories {     // Use 'jcenter' for resolving your dependencies.     // You can declare any Maven/Ivy/file repository here.     jcenter() }

    // In this section you declare the dependencies for your production and test code dependencies {     // The production code uses the SLF4J logging API at compile time     compile 'org.slf4j:slf4j-api:1.7.12'

        // Declare the dependency for your favourite test framework you want to use in your tests.     // TestNG is also supported by the Gradle Test task. Just change the     // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add     // 'test.useTestNG()' to your build script.     testCompile 'junit:junit:4.12' }</pre>

    配置和使用外部依賴

    Gradle如何引用外部庫?我們來看看兩個DSL配置元素:repositoriesdependencies

    定義倉庫

    在Java世界,依賴都是以JAR文件的形式發布和使用的。許多類庫都可以在倉庫中找到,倉庫可以是一個文件系統或者一個中心服務器。Gradle要求你定義至少一個倉庫來使用依賴。為此,你需要使用公共的可訪問的倉庫Maven Central:

    repositories {
        mavenCentral()        //配置對Maven Central2倉庫訪問的快捷方式 
    }

    定義好倉庫之后,你就可以聲明類庫了。讓我們看看依賴是如何定義的!

    定義依賴

    一個依賴是通過group標識符名字和一個指定版本來確定的。如例:

    dependencies {
        compile group:'org.apache.commons',name:'commons-lang3',version:'3.1'
    }

    在Gradle中,依賴是由configuration分組的。Java插件引入的一種configuration是compile。你可以通過configuration的名字看出它是給編譯源代碼使用的。

    解析依賴

    Gradle會自動檢測到一個新的依賴添加到項目中。如果依賴沒有被成功解析,那么就會在下一個需要使用該依賴的任務啟動時去下載它。

    來自:http://my.oschina.net/fhd/blog/520123

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!