gradle常用命令
//列出項目的所有屬性. 這樣你就可以看到插件加入的屬性以及它們的默認值.
gradle properties //列出項目的所有任務 gradle -q tasks --all
字符串
-
' ' 僅僅表示一個字符串
-
" " 字符串拼接,可以拼接變量變量,也可以拼接任務$任務
-
''' ''' 可以用來換行
定義常量
一個項目對應一個project實例,gradle根據build.gradle配置內容實例化project實例
project屬性有group,name,version
方法有apply ,repositories,dependencies,task
屬性的其他配置方式可以通過 : ext , gradle.properties
ext.property1 = "this is property1" //也可以用閉包的方式 ext { property2 = "this is property2" }
定義任務
task hello { doLast { println 'Hello world!' } }
快捷的定義方式,使用<< 代替 doLast{}
<< 操作符是 doLast 的簡單別稱.
task helloWorld << { println 'helloWorld343' }
默認任務定義,調用任何任務都會執行的任務,沒有<< 也米有doLast{}
task defaultmytask { println 'ddddddd' }
聲明任務之間的依賴
intro 依賴於 hello, 所以執行 intro 的時候 hello 命令會被優先執行來作為啟動 intro 任務的條件.
在加入一個依賴之前, 這個依賴的任務不需要提前定義
task hello << { println 'Hello world!' } task intro(dependsOn: hello) << { println "I'm Gradle" }
動態任務
下面的times是遍歷,counter是遍歷的變量名
4.times { counter -> task "task$counter" << { println "I'm task number $counter" } }
使用插件
//方式一
plugins { id 'war' id 'org.hidetake.ssh' version '2.9.0' } //方式二 //插件 apply plugin: 'java-library' apply plugin: 'eclipse' apply plugin: 'maven' apply plugin: 'java'
使用倉庫
repositories
{
//第三方倉庫 maven{url 'http://maven.aliyun.com/nexus/content/groups/public/'} //maven中央倉庫 mavenCentral() jcenter() }
添加依賴
dependencies {
compile group: 'commons-collections', name: 'commons-collections', version: '3.2' testCompile group: 'junit', name: 'junit', version: '4.+' }
定制項目
//jdk版本
sourceCompatibility = 1.8 //編碼 [compileJava,compileTestJava,javadoc]*.options*.encoding = 'UTF-8' //項目版本 version = '1.0'
上傳jar包
uploadArchives {
repositories { flatDir { dirs 'repos' } } }
uploadArchives {
repositories { mavenDeployer { //userName 和 password 為maven的用戶名和密碼 repository(url: "http://172.30.10.160:8081/nexus/content/repositories/snapshots/") { authentication(userName: "deploy", password: "deploy123") } pom.project { name=project.name packaging='jar' description='a test' } } } }
也可以使用maven-publish插件
多項目構建
//settings.gradle
//上下層級構建多項目 rootProject.name = '111' include '111-1' include '111-2' //同一層級構建多項目 rootProject.name = '111' includeFlat '111-1' includeFlat '111-2'
項目之間的依賴
dependencies {
compile project(":111-2") }
解決版本沖突
-
查看依賴報告
-
排除傳遞性依賴
-
強制指定一個版本
groovy默認使用最高版本幫助我們解決版本沖突
//修改默認策略,如果由版本沖突,就構建失敗
configurations.all { resolutionStrategy { failOnVersionConflict() } } //解決方式 //1.排除傳遞性依賴 dependencies { compile (''){ exclude } } //2.強制指定一個版本 configurations.all { resolutionStrategy { failOnVersionConflict() force '' } }
多項目構建-公共配置
allprojects對所有的項目有效
subprojects對所有的項目有效也可以個性化定制
allprojects {
apply plugin: 'java' sourceCompatibility = 1.8 //修改默認策略,如果由版本沖突,就構建失敗 configurations.all { resolutionStrategy { failOnVersionConflict() } } uploadArchives { repositories { flatDir { dirs 'repos' } } } } //倉庫,依賴放在allprojects中也可以 subprojects { //倉庫 repositories { jcenter() } //依賴 dependencies { } }
屬性也可以定義在gradle.properties
group=com.home.woms version=1.1.1
多項目構建-獨享配置
在父項目bulid.gradle中配置子項目
project(‘:core’) { ext{ hibernateVersion = ‘4.2.1.Final’ } dependencies { compile “org.hibernate:hibernate-core:${hibernateVersion}” } }
多項目構建-多環境配置
http://www.infoq.com/cn/articles/Gradle-application-in-large-Java-projects/
1. 通過指定不同的資源文件目錄
-
resources: 通用配置放在這兒
-
resources-dev: 開發環境配置
-
resources-prod: 生產環境配置
apply plugin: 'war' archivesBaseName = 'project-web' version = '1.0.0' // // 設置默認 resources 為開發環境狀態 // // 這兒如果不設置的話,idea 編譯時只會默認獲取 resources 目錄 // sourceSets { main { resources { srcDirs = ['src/main/resources', 'src/main/resources-dev'] } } } task release (dependsOn : war) { doFirst{ sourceSets { main { resources { srcDirs = ["src/main/resources", "src/main/resources-prod"] } } } } doLast{ println "${sourceSets.main.resources.srcDirs}" } }
-
gradle war: 這個是用來打測試的 war 包,采用的是 resources-dev。
-
gradle release: 這個才是用來打生產用的 war 包,采用的是 resources-prod。
ext {
profile = project['profile'] } sourceSets { main { resources { srcDir "config/application/spring/${profile}", "config/application/properties/${profile}" } } } //這樣在打包的過程中,就可以使用-P傳入的參數的資源文件夾下面的properties和xml文件作為項目的配置文件。
2. 傳統的properties文件
//第一種方式是使用傳統的properties文件, 然后在使用Gradle時,通過傳入不同的參數加載不同的properties文件。例如,我們可以在項目中提供development.properties、test.properties和production.properties。在項目運行時,使用-Pprofile=development來指定加載開發環境的配置。構建腳本中加載properties文件的代碼如下
allprojects{ apply plugin: 'java' ext { profile = 'uat' // profile = project['profile'] } //gradle構建過程中的默認任務processResources,重寫 processResources {//替換文件使用@key@來標注要被替換的位置,例如 username=@username@ from(sourceSets.main.resources.srcDirs) { filter(org.apache.tools.ant.filters.ReplaceTokens,tokens: loadProperties()) } } } def loadProperties(){ def props = new Properties() new File("${rootProject.projectDir}/conf/${profile}.properties") .withInputStream { stream -> props.load(stream) } props }
3. config.groovy配置文件
def loadGroovy(){ def configFile = file('config.groovy') new ConfigSlurper(profile).parse(configFile.toURL()).toProperties() } //替換 processResources { from(sourceSets.main.resources.srcDirs) { filter(org.apache.tools.ant.filters.ReplaceTokens,tokens: loadGroovy()) } }
構建腳本的依賴
除了項目需要依賴之外,構建腳本本身也可以有自己的依賴。當使用一個非Gradle官方提供的插件時,就需要在構建腳本里指定其依賴,當然還需要指定該插件的Repository。在Gradle中,使用buildscript塊為構建腳本配置依賴。
比如在項目中使用cucumber-JVM作為項目BDD工具,而Gradle官方沒有提供它的插件,好在開源社區有人提供cucumber的插件。在構建腳本中添加如下代碼:
buildscript {
repositories { mavenCentral() } dependencies { classpath "gradle-cucumber-plugin:gradle-cucumber-plugin:0.2" } } apply plugin: com.excella.gradle.cucumber.CucumberPlugin
apply其他Gradle文件
當一個項目很復雜的時候,Gradle腳本也會很復雜,除了將子項目的配置移到對應項目的構建腳本之外,還可以可以按照不同的功能將復雜的構建腳本拆分成小的構建腳本,然后在build.gradle里使用apply from,將這些小的構建腳本引入到整體的構建腳本中去。比如在一個項目中既使用了Jetty,又使用了Cargo插件啟動JBoss,就可以把他們分別提到jetty.gradle和jboss.gradle,然后在build.gradle里使用如下的代碼將他們引入進來:
apply from: "jetty.gradle" apply from: "jboss.gradle"
定義資源目錄
sourceSets {
main { java { srcDir 'src/main/java' // 指定源碼目錄 } resources { srcDir 'src/main/resources' //資源目錄 } } } //或者 sourceSets { main.java.srcDirs = ['src/main/java'] main.resources.srcDirs = ['src/main/resources'] }