JAVA編譯工具gradle
- 2019 年 10 月 7 日
- 筆記
一、編譯工具歷史
grade用在android環境被大家所熟知,其實grade是一種流行的編譯框架,也可以用在編譯java環境上。
1.1 Java編譯步驟
java工程的編譯史是,JAVA工程一開始是用javac,但是構建一個項目需要做到:
- 編譯源碼
- 單元測試、集成測試
- 執行靜態程式碼分析
- 創建發布版本
- 部署到目標環境
- 部署傳遞過程
- 執行冒煙測試和自動功能測試
1.2 編譯演進史
完成這一系列步驟的是項目構建工具,先後有了ANT, Maven,Gradle
- ANT是類似於Make的自動化編譯工具,編譯規則用XML描述。但是ANT的XML描述文件不便於人工閱讀,並且臃腫。而且ANT沒有依賴包管理(Ivy改進了)。
- 後面又有了Maven。Maven解決了依賴包管理問題,並且能夠從網路上下載依賴包。但是Maven沒有解決包版本衝突問題,雖然改進了XML的描述語法更加簡潔,但是還是有XML缺點。
- Gradle最大的改進是,拋棄XML,擁抱DSL描述性語言,語法更簡潔,同樣的意思用極少量的語言表達出來。
二、gradle認知
2.1 buildscript塊
buildscript { repositories { mavenCentral() } dependencies { } }
buildscript中定義了腳本需要使用的資源。包括依賴項、第三方插件、maven倉庫地址等。gradle在執行腳本時,第一執行buildscript程式碼塊中的內容,然後執行剩餘的build腳本。
2.2 插件
「buildscript {}」塊指定第三方庫作為Gradle插件的話,指定插件使用「apply plugin」。比如接著在build.gradle繼續寫入。
apply plugin: "java" apply plugin: "eclipse" apply plugin: "idea" apply plugin: "application" // use jacocoTestReport task to create coverage report apply plugin: "jacoco"
2.3 jdk版本限定
接著使用sourceCompatibility 和targetCompatibility定義jdk版本。分別是制定編譯java文件位元組碼和java虛擬機兼容的版本號。
sourceCompatibility = 1.8 targetCompatibility = 1.8
2.4 常量
接下來定義些常量。常量定義了常用組件的版本號,在後續腳本直接引用此常亮,後續有升級依賴版本號更方便。
def log4jVersion = "2.11.2" def scalaVersion = "2.11" def sparkVersion = "2.2.0" def clouderaVersion = "cdh6.0.0" //def kafkaVersion = "0.9.0-kafka-2.0.2" def kafkaVersion = "0.8.2.1" def jacksonVersion = "2.9.9"
2.5 依賴倉庫
使用repository定義依賴倉庫:
repositories { mavenCentral() // spark maven { url "https://repository.cloudera.com/artifactory/cloudera-repos/" } }
2.6 mainClassname定義了class的名字
mainClassName="com.xxx.xxx"
2.7 配置強製版本號和exclude選項
configurations.all { resolutionStrategy { force "io.netty:netty-all:4.1.6.Final" force "io.netty:netty-tcnative-boringssl-static:1.1.33.Fork23" } exclude group: 'org.slf4j', module: 'slf4j-log4j12' }
2.8 依賴模組
buildscript程式碼塊中的repositories和dependencies的使用方式與直接在build.gradle文件中一樣。不同之處是在buildscript程式碼塊中你可以對dependencies使用classpath聲明。compile是build使用的依賴,而testCompile是編譯測試用例所需要的依賴。
dependencies { compile "com.googlecode.json-simple:json-simple:1.1" compile("io.lettuce:lettuce-core:5.0.3.RELEASE") { exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl' exclude group: "io.netty" } testCompile "info.solidsoft.mockito:mockito-java8:1.0.0-beta" compile fileTree(dir: 'libs', include: ['*.jar']) }
2.9 測試相關:
test { systemProperty "io.lettuce.core.epoll", "false" testLogging { exceptionFormat "full" events "passed", "skipped", "failed" quiet { events "failed" exceptionFormat "full" } } reports { junitXml.enabled = true html.enabled = true } if (Files.exists(Paths.get("reports"))) { File out = File.createTempFile("testlog-", ".txt", new File("reports")) beforeTest { descriptor -> out.append("Running test: " + descriptor + "n"); } // listen to standard out and standard error of the test JVM(s) onOutput { descriptor, event -> out.append(event.message.replaceAll(/n$/, "") + "n") } } }
2.10 解析完的構建
開始構建會進入到此項腳本
gradle.taskGraph.whenReady { }
2.11 各種task
接著可以定義各種task。
task spark(type: Jar) { from sourceSets.main.output baseName = 'spark' }
2.12 打包後的操作
compileJava.doLast { tasks.instrument.execute() }
三、gradle使用
3.1 安裝gradle
當前最新的是這個wget https://downloads.gradle-dn.com/distributions/gradle-5.6.2-bin.zip。這個鏈接不能保證後面也有效。
3.2 使用gradle
讓gradle去解析build.gradle文件或者執行./gradlew tasks列出所有可執行的task。

執行相應的tasks任務,比如./gradlew build,./gradlew test等等。