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。

圖1 grdle列出所有的task

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