說來慚愧,敲代碼這么多年都沒寫半篇文章,本來想著好好寫一回筆記,結(jié)果因?yàn)楣ぷ鞣泵?、生活瑣事又落下了(其?shí)是筆者范懶 >_<!)。這下“初探”這詞是沒法用了,想著就是寫寫平常使用時(shí)的心得,就改叫“日?!卑?。
扯了扯閑話,言歸正傳。公司要開發(fā)一個(gè)框架型的項(xiàng)目,本來想用Maven的,我想著之前寫過一個(gè)多項(xiàng)目的Gradle配置就拿來直接用了。由于強(qiáng)迫癥又發(fā)了,上官網(wǎng)下個(gè)新版本,結(jié)果發(fā)現(xiàn)3.1版本的文檔里多了以下兩篇:
lvy 暫時(shí)沒用過,不提。這里寫一下使用Gradle發(fā)布資源到 Maven 倉(cāng)庫(kù)的方式,在新版本中Gradle在“maven-publish”插件中增加了發(fā)布的功能,用來取代舊版本中Task的方式(舊版本發(fā)布方式詳見上一篇:Gradle初探(三):發(fā)布項(xiàng)目到Nexus資源庫(kù))。官方文檔原文如下:
This chapter describes the new incubating Maven publishing support provided by the “maven-publish” plugin. Eventually this new publishing support will replace publishing via the Upload task.
If you are looking for documentation on the original Maven publishing support using the Upload task please see Chapter 31, Publishing artifacts.
1. 創(chuàng)建項(xiàng)目以新版本的方式發(fā)布
創(chuàng)建一個(gè)Gradle項(xiàng)目(以多項(xiàng)目Gradle為例)
build.gradle文件內(nèi)容:
group 'z99' version '1.0-SNAPSHOT' subprojects { group 'z99' version '1.0-SNAPSHOT' // 引用的插件 apply plugin: 'java' apply plugin: 'maven' apply plugin: 'maven-publish' // 編譯環(huán)境 sourceCompatibility = jdkVer targetCompatibility = jdkVer // 字符集 tasks.withType(JavaCompile) { options.encoding = encoding } // 資源庫(kù) repositories { mavenLocal() maven { // 啊哈,配上阿里云的資源庫(kù),速度杠杠的 url "http://maven.aliyun.com/nexus/content/groups/public/" } jcenter() mavenCentral() } // 依賴 dependencies { testCompile group: 'junit', name: 'junit', version: junitVer compile group: 'org.slf4j', name: 'slf4j-log4j12', version: slf4jLog4j12Ver // 添加 libs 文件夾下的 jar compile fileTree(dir: 'libs', include: ['*.jar']) } // 打包 publishing { publications { mavenJava(MavenPublication) { from components.java } } } // 如果是發(fā)行版本,則上傳到發(fā)行庫(kù)。否則上傳到快照庫(kù)。 def postfixUrl = "repository/maven-snapshots" if (project.version.endsWith("-RELEASE")) { postfixUrl = "repository/maven-releases" } // 發(fā)布到本地Maven庫(kù)和遠(yuǎn)程Maven服務(wù)器 publishing { repositories { mavenLocal() maven { credentials { username ossUserName password ossPwd } url "$ossHost/$postfixUrl/" } } } }
gradle.properties文件內(nèi)容:
\# 基本信息配置 jdkVer=1.8 encoding=UTF-8 \# 資源庫(kù)配置 ossRepoUrl=http://127.0.0.1:9001/repository/maven-public/ \# 用于上傳的資源庫(kù)配置 ossHost=http://127.0.0.1:9001 ossUserName=admin ossPwd=admin123 \# 依賴包版本配置 junitVer=4.12 slf4jLog4j12Ver=1.7.21 servletApiVer=3.1.0
settings.gradle文件內(nèi)容:
rootProject.name = 'gradle-demo' include 'sub-a', 'sub-b'
build之后,文件結(jié)構(gòu)如下:


之后執(zhí)行“publish”命令,則可以將兩個(gè)子項(xiàng)目分別都發(fā)布到maven私服和本地maven資源庫(kù)中。
命令執(zhí)行控制臺(tái)輸出:

Maven私服庫(kù):

Maven本地庫(kù):

2. 子項(xiàng)目單獨(dú)配置時(shí)的發(fā)布
寫到這里,其實(shí)流程和舊版用Task的步驟差不多,但是這是在多項(xiàng)目中,各版本用統(tǒng)一的版本號(hào)發(fā)布的情況,但實(shí)際開發(fā)中主項(xiàng)目下各子模塊項(xiàng)目的版本號(hào)不可能一致,之前舊版時(shí),這種情況下就會(huì)出現(xiàn)一個(gè)比較難受的寫法,如下:
為了主配置文件簡(jiǎn)潔,我引入一個(gè)subprojects.gradle文件來專門寫子模塊的部分。
subprojects.gradle文件具體內(nèi)容如下:
project(':sub-a') { version '1.0-SNAPSHOT' } project(':sub-b') { version '2.0-SNAPSHOT' }
然后再build.gradle中,去掉子項(xiàng)目的版本配置,在文件尾部加上
apply from: 'subprojects.gradle'
即可。
用舊版本的方式發(fā)布一下看看:
首先修改build.gradle,注釋掉publish的部分,加上upload的代碼:
// 打包 /*publishing { publications { mavenJava(MavenPublication) { from components.java } } }*/ // 如果是發(fā)行版本,則上傳到發(fā)行庫(kù)。否則上傳到快照庫(kù)。 def postfixUrl = "repository/maven-snapshots" if (project.version.endsWith("-RELEASE")) { postfixUrl = "repository/maven-releases" } // 發(fā)布到本地Maven庫(kù)和遠(yuǎn)程Maven服務(wù)器 /*publishing { repositories { mavenLocal() maven { credentials { username ossUserName password ossPwd } url "$ossHost/$postfixUrl/" } } }*/ uploadArchives.repositories.mavenDeployer { repository(url: "$ossHost/$postfixUrl/") { authentication(userName: ossUserName, password: ossPwd) } pom.version = project.version pom.artifactId = project.name pom.groupId = project.group }
然后執(zhí)行“upload”(注意:不是3.x版本的“publish”)命令執(zhí)行發(fā)布,結(jié)果如下:

納尼,發(fā)生了什么?這就是舊版本的問題所在了,通過截圖可以知道版本號(hào)的位置變成了“unspecified”,也就是說“pom.version = project.version”時(shí)拿不到版本號(hào)的信息,這原因就在于舊版本中upload的配置是作為一個(gè)task進(jìn)行配置,而在主配置文件中,我是先配置了upload,才引用了子項(xiàng)目的配置文件,因此,要想配置生效則只能改為:
subprojects {
// 之前的其他配置
}
apply from: 'subprojects.gradle'
subprojects {
// upload的配置
}
如此才能正常上傳發(fā)布(這里就不演示了),這寫法對(duì)于代碼強(qiáng)迫癥重癥患者簡(jiǎn)直不能忍啊,所以一度有想換回Maven的念頭。直到發(fā)現(xiàn)了新版本中的publish之后。
那么新版本的中,只需在原主配置的末尾加上'apply from: 'subprojects.gradle''即可。發(fā)布后控制臺(tái)顯示成功,如下圖所示:

3. 子項(xiàng)目包含jar、war等不同打包方式時(shí)的發(fā)布方法
一般子項(xiàng)目中也存在既有純java的項(xiàng)目,也有web項(xiàng)目的情況。在例子中,比如把子項(xiàng)目2改為web項(xiàng)目,現(xiàn)在做下列的修改。
subprojects.gradle文件內(nèi)容:
project(':sub-a') { version '1.0-SNAPSHOT' // 打包 publishing { publications { mavenJava(MavenPublication) { from components.java } } } } project(':sub-b') { version '2.0-SNAPSHOT' apply plugin: 'war' dependencies { providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: servletApiVer } publishing { publications { mavenJava(MavenPublication) { from components.web } } } }
build.gradle文件內(nèi)容:
group 'z99' version '1.0-SNAPSHOT' subprojects { group 'z99' // 引用的插件 apply plugin: 'java' apply plugin: 'maven' apply plugin: 'maven-publish' // 編譯環(huán)境 sourceCompatibility = jdkVer targetCompatibility = jdkVer // 字符集 tasks.withType(JavaCompile) { options.encoding = encoding } // 資源庫(kù) repositories { mavenLocal() maven { // 啊哈,配上阿里云的資源庫(kù),速度杠杠的 url "http://maven.aliyun.com/nexus/content/groups/public/" } jcenter() mavenCentral() } // 依賴 dependencies { testCompile group: 'junit', name: 'junit', version: junitVer compile group: 'org.slf4j', name: 'slf4j-log4j12', version: slf4jLog4j12Ver // 添加 libs 文件夾下的 jar compile fileTree(dir: 'libs', include: ['*.jar']) } // 如果是發(fā)行版本,則上傳到發(fā)行庫(kù)。否則上傳到快照庫(kù)。 def postfixUrl = "repository/maven-snapshots" if (project.version.endsWith("-RELEASE")) { postfixUrl = "repository/maven-releases" } // 發(fā)布到本地Maven庫(kù)和遠(yuǎn)程Maven服務(wù)器 publishing { repositories { mavenLocal() maven { credentials { username ossUserName password ossPwd } url "$ossHost/$postfixUrl/" } } } } // 引入子項(xiàng)目的配置 apply from: 'subprojects.gradle'
執(zhí)行結(jié)果,如下圖:

要點(diǎn)就是一個(gè)是“from components.java”,另一個(gè)是“from components.web”,目前3.1版官方貌似只給了這兩種。
有一點(diǎn)要注意的是publishing這個(gè)配置不能覆蓋(或者是我沒找到方法),我一開始是沒有刪去打包java的publishing配置,想直接在war的獨(dú)立配置里直接配一個(gè)打包為war的publishing配置,結(jié)果報(bào)錯(cuò),說是不能配置多個(gè)components。目前尚未找到解決方案,先這么著吧。
有點(diǎn)犯困了,后面寫的有點(diǎn)草率。今天就這樣吧,明天還得加班 >_<!。引用一句老婆常說的話結(jié)尾吧:
哎,苦逼的程序猿。。。