這篇說明如何使用 Gradle 編譯 spring boot application,直接來看個例子。
buildscript {
ext {
springBootVersion = '1.5.10.RELEASE'
}
repositories {
maven { url "http://maven.springframework.org/milestone" }
maven { url "http://repo.maven.apache.org/maven2" }
maven { url "http://repo1.maven.org/maven2/" }
maven { url "http://amateras.sourceforge.jp/mvn/" }
mavenCentral()
jcenter()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
group = 'idv.steven.crawler'
sourceCompatibility = 1.8
targetCompatibility = 1.8
bootRepackage {
mainClass = 'idv.steven.crawler.CrawlerStarter'
}
jar {
baseName = 'my-crawler'
version = '1.0.0'
}
buildDir = 'build'
repositories {
mavenCentral()
maven { url "http://maven.springframework.org/milestone" }
maven { url "http://repo.maven.apache.org/maven2" }
maven { url "http://repo1.maven.org/maven2/" }
maven { url "http://amateras.sourceforge.jp/mvn/" }
}
configurations.all {
exclude group: 'log4j', module: 'log4j'
exclude group: 'org.slf4j', module: 'slf4j-log4j12'
exclude group: 'org.slf4j', module: 'log4j-over-slf4j'
exclude group: 'ch.qos.logback', module: 'logback-core'
exclude group: 'ch.qos.logback', module: 'logback-classic'
}
dependencies {
def log4j2Version = '2.10.0'
def fasterxmlVersion = '2.9.3'
def hibernateVersion = '5.2.13.Final'
compile fileTree(dir: 'lib', include: ['*.jar'])
compile("org.springframework.boot:spring-boot-starter-web") {
exclude module: "spring-boot-starter-tomcat"
}
compile('org.springframework.boot:spring-boot-starter-aop')
compile('org.springframework.boot:spring-boot-starter-batch')
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-mail')
compile("org.thymeleaf:thymeleaf-spring4")
compile("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect")
compile group: 'org.hibernate', name: 'hibernate-core', version: "${hibernateVersion}"
compile group: 'org.hibernate', name: 'hibernate-entitymanager', version: "${hibernateVersion}"
compile group: 'org.hibernate', name: 'hibernate-validator', version: '6.0.7.Final'
compile group: 'javax.inject', name: 'javax.inject', version: '1'
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: "${log4j2Version}"
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: "${log4j2Version}"
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: "${log4j2Version}"
compile group: 'joda-time', name: 'joda-time', version: '2.9.9'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: "${fasterxmlVersion}"
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${fasterxmlVersion}"
compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: "${fasterxmlVersion}"
compile group: 'org.json', name: 'json', version: '20180130'
compile group: 'net.minidev', name: 'json-smart', version: '2.3'
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
compile group: 'javax.validation', name: 'validation-api', version: '2.0.1.Final'
compile group: 'com.lmax', name: 'disruptor', version: '3.3.7'
compileOnly "org.projectlombok:lombok:1.16.20"
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.springframework.batch:spring-batch-test')
}
- 一開始 buildscript 中紅色部份,設定 spring boot 版本,後面 dependencies (依賴) 的部份引入 spring boot 時,即會引入這個版本。
- buildscript 的 repositories 指定了好幾個版本庫,一般都只指定 mavenCentral(),但是,有時這個版本庫裡可能沒有我們要的 jar 檔,也可能剛好掛了或被公司防火牆擋了,設定多個比較可以確保可以抓到需要的 jar 檔。
- apply plugin 我們導入 java 和 org.springframe.boot,這樣我們就可以使用這兩個物件的 method。
- bootRepackage (黃底) 設定這個 application 的 main 檔在那一個類別裡。
- jar (綠底) 設定了這個 application 編譯出來的檔名及版號。
- buildDir (紅底) 指出編譯出來的檔案要放在那個目錄下,不指定的話,預設就會放在 build 目錄下。
- configurations.all 在這裡可以定義一些 global 的設定,以上例來說,定義了在依賴關係中,如果有依賴這些 jar 檔的,就不要引入,因為 spring boot 預設是的 log 機制是用 logback,有些其它的 framework 預設是用 log4j,但是我希望這個程式用 log4j2,所以在 這些設定排除 logback 及 log4j 的 jar 檔。
- compile fileTree 是當有一些 jar 檔就在自己的本機,因為我有使用一些公司內部自行開發的共用函式庫的 jar 檔,這些 jar 檔放在 lib 目錄下,如此設定,就會把這些 jar 檔也包進來一起編譯。
- exclude module (紫底) 是在設定要引入的 jar 檔時,Gradle 會自動將相依的 jar 檔包裝進來,但是,有時有些 jar 檔我們並不需要,就可以用這個方法將它排除! 在 spring boot 中,引入 web 時,預設會包含 embedded tomcat,但是這個程式不是 web 程式,只是會用到 http client,所以將 embedded tomcat 排程。這裡還有個要特別注意的,spring boot 在一開頭已經有設定版號,這些不需寫版號。
- 有些 jar 檔只有在 compile 階段會用到,這時候就可以用 compileOnly (橘底),lombok 只是在編譯時幫程式員產生些像是 getter、setter method,或是 log 的宣告等,以簡化程式的撰寫,但是產生好讓 Gradle 編譯後,就沒它的事了,runtime 並不會用到,也不會被包入最後產生的 jar 檔裡。
- testCompile 是用來引入單元測試用的 jar 檔,這些 jar 檔只有開發階段進行單元測試時會用到,也不會被包入最後產生的 jar 檔裡。
沒有留言:
張貼留言