說來慚愧,敲代碼這么多年都沒寫半篇文章,本來想著好好寫一回筆記,結果因為工作繁忙、生活瑣事又落下了(其實是筆者范懶 >_<!)。這下“初探”這詞是沒法用了,想著就是寫寫平常使用時的心得,就改叫“日常”吧。
扯了扯閑話,言歸正傳。公司要開發一個框架型的項目,本來想用Maven的,我想著之前寫過一個多項目的Gradle配置就拿來直接用了。由于強迫癥又發了,上官網下個新版本,結果發現3.1版本的文檔里多了以下兩篇:
lvy 暫時沒用過,不提。這里寫一下使用Gradle發布資源到 Maven 倉庫的方式,在新版本中Gradle在“maven-publish”插件中增加了發布的功能,用來取代舊版本中Task的方式(舊版本發布方式詳見上一篇:Gradle初探(三):發布項目到Nexus資源庫)。官方文檔原文如下:
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. 創建項目以新版本的方式發布
創建一個Gradle項目(以多項目Gradle為例)
build.gradle文件內容:
group 'z99' version '1.0-SNAPSHOT' subprojects { group 'z99' version '1.0-SNAPSHOT' // 引用的插件 apply plugin: 'java' apply plugin: 'maven' apply plugin: 'maven-publish' // 編譯環境 sourceCompatibility = jdkVer targetCompatibility = jdkVer // 字符集 tasks.withType(JavaCompile) { options.encoding = encoding } // 資源庫 repositories { mavenLocal() maven { // 啊哈,配上阿里云的資源庫,速度杠杠的 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 } } } // 如果是發行版本,則上傳到發行庫。否則上傳到快照庫。 def postfixUrl = "repository/maven-snapshots" if (project.version.endsWith("-RELEASE")) { postfixUrl = "repository/maven-releases" } // 發布到本地Maven庫和遠程Maven服務器 publishing { repositories { mavenLocal() maven { credentials { username ossUserName password ossPwd } url "$ossHost/$postfixUrl/" } } } }
gradle.properties文件內容:
\# 基本信息配置 jdkVer=1.8 encoding=UTF-8 \# 資源庫配置 ossRepoUrl=http://127.0.0.1:9001/repository/maven-public/ \# 用于上傳的資源庫配置 ossHost=http://127.0.0.1:9001 ossUserName=admin ossPwd=admin123 \# 依賴包版本配置 junitVer=4.12 slf4jLog4j12Ver=1.7.21 servletApiVer=3.1.0
settings.gradle文件內容:
rootProject.name = 'gradle-demo' include 'sub-a', 'sub-b'
build之后,文件結構如下:
之后執行“publish”命令,則可以將兩個子項目分別都發布到maven私服和本地maven資源庫中。
命令執行控制臺輸出:
Maven私服庫:
Maven本地庫:
2. 子項目單獨配置時的發布
寫到這里,其實流程和舊版用Task的步驟差不多,但是這是在多項目中,各版本用統一的版本號發布的情況,但實際開發中主項目下各子模塊項目的版本號不可能一致,之前舊版時,這種情況下就會出現一個比較難受的寫法,如下:
為了主配置文件簡潔,我引入一個subprojects.gradle文件來專門寫子模塊的部分。
subprojects.gradle文件具體內容如下:
project(':sub-a') { version '1.0-SNAPSHOT' } project(':sub-b') { version '2.0-SNAPSHOT' }
然后再build.gradle中,去掉子項目的版本配置,在文件尾部加上
apply from: 'subprojects.gradle'
即可。
用舊版本的方式發布一下看看:
首先修改build.gradle,注釋掉publish的部分,加上upload的代碼:
// 打包 /*publishing { publications { mavenJava(MavenPublication) { from components.java } } }*/ // 如果是發行版本,則上傳到發行庫。否則上傳到快照庫。 def postfixUrl = "repository/maven-snapshots" if (project.version.endsWith("-RELEASE")) { postfixUrl = "repository/maven-releases" } // 發布到本地Maven庫和遠程Maven服務器 /*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 }
然后執行“upload”(注意:不是3.x版本的“publish”)命令執行發布,結果如下:
納尼,發生了什么?這就是舊版本的問題所在了,通過截圖可以知道版本號的位置變成了“unspecified”,也就是說“pom.version = project.version”時拿不到版本號的信息,這原因就在于舊版本中upload的配置是作為一個task進行配置,而在主配置文件中,我是先配置了upload,才引用了子項目的配置文件,因此,要想配置生效則只能改為:
subprojects {
// 之前的其他配置
}
apply from: 'subprojects.gradle'
subprojects {
// upload的配置
}
如此才能正常上傳發布(這里就不演示了),這寫法對于代碼強迫癥重癥患者簡直不能忍啊,所以一度有想換回Maven的念頭。直到發現了新版本中的publish之后。
那么新版本的中,只需在原主配置的末尾加上'apply from: 'subprojects.gradle''即可。發布后控制臺顯示成功,如下圖所示:
3. 子項目包含jar、war等不同打包方式時的發布方法
一般子項目中也存在既有純java的項目,也有web項目的情況。在例子中,比如把子項目2改為web項目,現在做下列的修改。
subprojects.gradle文件內容:
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文件內容:
group 'z99' version '1.0-SNAPSHOT' subprojects { group 'z99' // 引用的插件 apply plugin: 'java' apply plugin: 'maven' apply plugin: 'maven-publish' // 編譯環境 sourceCompatibility = jdkVer targetCompatibility = jdkVer // 字符集 tasks.withType(JavaCompile) { options.encoding = encoding } // 資源庫 repositories { mavenLocal() maven { // 啊哈,配上阿里云的資源庫,速度杠杠的 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']) } // 如果是發行版本,則上傳到發行庫。否則上傳到快照庫。 def postfixUrl = "repository/maven-snapshots" if (project.version.endsWith("-RELEASE")) { postfixUrl = "repository/maven-releases" } // 發布到本地Maven庫和遠程Maven服務器 publishing { repositories { mavenLocal() maven { credentials { username ossUserName password ossPwd } url "$ossHost/$postfixUrl/" } } } } // 引入子項目的配置 apply from: 'subprojects.gradle'
執行結果,如下圖:
要點就是一個是“from components.java”,另一個是“from components.web”,目前3.1版官方貌似只給了這兩種。
有一點要注意的是publishing這個配置不能覆蓋(或者是我沒找到方法),我一開始是沒有刪去打包java的publishing配置,想直接在war的獨立配置里直接配一個打包為war的publishing配置,結果報錯,說是不能配置多個components。目前尚未找到解決方案,先這么著吧。
有點犯困了,后面寫的有點草率。今天就這樣吧,明天還得加班 >_<!。引用一句老婆常說的話結尾吧:
哎,苦逼的程序猿。。。