Gradle日常(四):3.x新版本發布資源的方式

說來慚愧,敲代碼這么多年都沒寫半篇文章,本來想著好好寫一回筆記,結果因為工作繁忙、生活瑣事又落下了(其實是筆者范懶 >_<!)。這下“初探”這詞是沒法用了,想著就是寫寫平常使用時的心得,就改叫“日常”吧。

扯了扯閑話,言歸正傳。公司要開發一個框架型的項目,本來想用Maven的,我想著之前寫過一個多項目的Gradle配置就拿來直接用了。由于強迫癥又發了,上官網下個新版本,結果發現3.1版本的文檔里多了以下兩篇:

34. Ivy Publishing (new)
35. Maven Publishing (new)

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之后,文件結構如下:

QQ圖片20161027000602.png
QQ圖片20161027000556.png

之后執行“publish”命令,則可以將兩個子項目分別都發布到maven私服和本地maven資源庫中。

命令執行控制臺輸出:

QQ圖片20161027003023.png

Maven私服庫:

QQ圖片20161027003132.png

Maven本地庫:

QQ圖片20161027003211.png

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”)命令執行發布,結果如下:

Paste_Image.png

納尼,發生了什么?這就是舊版本的問題所在了,通過截圖可以知道版本號的位置變成了“unspecified”,也就是說“pom.version = project.version”時拿不到版本號的信息,這原因就在于舊版本中upload的配置是作為一個task進行配置,而在主配置文件中,我是先配置了upload,才引用了子項目的配置文件,因此,要想配置生效則只能改為:

subprojects {
// 之前的其他配置
}
apply from: 'subprojects.gradle'
subprojects {
// upload的配置
}

如此才能正常上傳發布(這里就不演示了),這寫法對于代碼強迫癥重癥患者簡直不能忍啊,所以一度有想換回Maven的念頭。直到發現了新版本中的publish之后。
那么新版本的中,只需在原主配置的末尾加上'apply from: 'subprojects.gradle''即可。發布后控制臺顯示成功,如下圖所示:

Paste_Image.png

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'

執行結果,如下圖:

Paste_Image.png

要點就是一個是“from components.java”,另一個是“from components.web”,目前3.1版官方貌似只給了這兩種。
有一點要注意的是publishing這個配置不能覆蓋(或者是我沒找到方法),我一開始是沒有刪去打包java的publishing配置,想直接在war的獨立配置里直接配一個打包為war的publishing配置,結果報錯,說是不能配置多個components。目前尚未找到解決方案,先這么著吧。

有點犯困了,后面寫的有點草率。今天就這樣吧,明天還得加班 >_<!。引用一句老婆常說的話結尾吧:

哎,苦逼的程序猿。。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,228評論 2 375

推薦閱讀更多精彩內容

  • 在 Android Studio 構建的項目中,基于 Gradle 進行項目的構建,同時使用 Android DS...
    Ant_way閱讀 7,404評論 0 16
  • 1. 什么是gradle? 很高興能向大家介紹Gradle,這是一個基于JVM的富有突破性構建工具。 它為您提供了...
    eSky閱讀 663評論 1 0
  • 私以為,要學習自定義Gradle插件,首先要搞清楚自定義Plugin的意義。或者說,自定義Plugin有什么作用?...
    MIAN勉閱讀 2,287評論 0 1
  • 所有Android插件的基本擴展。 你不需要直接使用這個,你可以選擇下面幾個合適的直接使用 AppExtensio...
    我該忘了我自己w_u閱讀 3,406評論 0 5
  • 今天是什么日子 起床:5:35 就寢:10:40 天氣:陰 心情:好 紀念日:叫弟妹帶孩子一起聚聚 計劃清單:1....
    過有準備的人生閱讀 101評論 0 1