原文地址:https://docs.gradle.org/4.1/userguide/publishing_maven.html#sec:the_mavenpublish_plugin
為學(xué)習(xí)gradle上傳中使用maven上傳aar jar artifact至maven倉(cāng)庫(kù)(私服or mavenCentral)
ps:從一個(gè)程序員的角度翻譯,應(yīng)該更能讓大家易于接受
目錄
- [36.1. The “maven-publish” Plugin] maven-publish插件介紹
- [36.2. Publications]發(fā)版物
- [36.3. Repositories]倉(cāng)庫(kù)
- [36.4. Performing a publish]執(zhí)行發(fā)布
- [36.5. Publishing to Maven Local]發(fā)布到本地Maven倉(cāng)庫(kù)
- [36.6. Generating the POM file without publishing]生成POM文件不依賴(lài)發(fā)版
本章介紹由“maven-publish”插件提供的新的Maven發(fā)布支持。 最終,這種新的出版支持將通過(guò)上傳任務(wù)取代發(fā)布任務(wù)(及 maven_push 將取代 uploadArchives 任務(wù))。
注意:此插件生成的生成的POM文件目前不受支持。 Gradle的未來(lái)版本可能會(huì)添加此功能。 請(qǐng)使用 Maven plugin 將您的工件發(fā)布到Maven Central。
如果您正在使用上傳任務(wù)查找原始Maven發(fā)布支持的文檔(上傳至mavenCentral),請(qǐng)參閱Chapter 32, Publishing artifacts.。
36.1. The “maven-publish” Plugin(maven_publish插件介紹)
以Maven格式發(fā)布的能力由“maven-publish”插件提供。
“publishing”插件在名為 “publishing” 的 PublishingExtension類(lèi)型的項(xiàng)目上創(chuàng)建了一個(gè)extension.此extension提供了一個(gè)命名發(fā)布的容器和一個(gè)命名倉(cāng)庫(kù)的容器。
“maven-publish”插件適用于 MavenPublication出版物和 MavenArtifactRepository存儲(chǔ)庫(kù)。
Example 36.1. Applying the 'maven-publish' plugin
build.gradle
apply plugin: 'maven-publish'
36.2. Publications(出版物介紹)
如果您不熟悉項(xiàng)目artifacts和配置,則應(yīng)閱讀 Chapter 32, Publishing artifacts這里介紹了基本的概念。 本章還介紹了使用不同于本章所述機(jī)制的“publishing artifacts”。 這里描述的發(fā)布功能最終將取代該功能。
對(duì)于“maven-publish”插件有任何影響,必須將MavenPublication 添加到該組發(fā)布中。 此出版物確定實(shí)際發(fā)布的artifacts以及相關(guān)POM文件中包含的詳細(xì)信息。 可以通過(guò)添加組件,自定義工件以及直接修改生成的POM文件來(lái)配置發(fā)布。
36.2.1. Publishing a Software Component(發(fā)布軟件組件)
將Gradle項(xiàng)目發(fā)布到Maven存儲(chǔ)庫(kù)的最簡(jiǎn)單的方法是指定要發(fā)布的SoftwareComponent。 目前可供出版的組件有:
在以下示例中,工件和運(yùn)行時(shí)依賴(lài)關(guān)系取自Java插件添加的“java”組件。
Example 36.2. Adding a MavenPublication for a Java component
build.gradle
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}
36.2.2. Publishing custom artifacts(上傳自定義artifacts)
也可以顯式地配置要包含在發(fā)布中的artifacts。 Artifacts通常作為原始文件提供,或作為AbstractArchiveTask (e.g. Jar, Zip)的實(shí)例提供。
對(duì)于每個(gè)自定義artifact,可以指定要用于發(fā)布的extension和classifier。 請(qǐng)注意,只有一個(gè)已發(fā)布的工件可以具有classifier,并且所有其他artifacts必須具有唯一的classifier/extension組合。
配置自定義artifacts如下:
Example 36.3. Adding additional artifact to a MavenPublication
build.gradle
task sourceJar(type: Jar) {
from sourceSets.main.allJava
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
artifact sourceJar {
classifier "sources"
}
}
}
}
有關(guān)如何自定義artifacts的更多信息,請(qǐng)參閱API文檔中的MavenPublication 類(lèi)。
36.2.3. Identity values in the generated POM(POM文件生成及配置)
生成的POM文件的屬性將包含從以下項(xiàng)目屬性派生的標(biāo)識(shí)值:
- groupId Project.getGroup()
- artifactId Project.getName()
- version Project.getVersion()
覆蓋默認(rèn)標(biāo)識(shí)值很簡(jiǎn)單:在配置MavenPublication時(shí),只需指定groupId,artifactId或版本屬性即可。
Example 36.4. customizing the publication identity
build.gradle
publishing {
publications {
maven(MavenPublication) {
groupId 'org.gradle.sample'
artifactId 'project1-sample'
version '1.1'
from components.java
}
}
}
Maven將“groupId”和“artifactId”限制為有限的字符集([A-Za-z0-9 _ \ - 。] +)),并且Gradle強(qiáng)制執(zhí)行此限制。 對(duì)于'version'(以及artifact'extension'和'classifier'),Gradle將處理任何有效的Unicode字符。
明確禁止的唯一Unicode值是“\”,“/”和任何ISO控制字符。 提供的價(jià)值在出版初期得到驗(yàn)證。
注意:某些存儲(chǔ)庫(kù)將無(wú)法處理所有支持的字符。 例如,當(dāng)在Windows上發(fā)布到文件系統(tǒng)支持的存儲(chǔ)庫(kù)時(shí),':'字符不能用作標(biāo)識(shí)符。
36.2.4. Modifying the generated POM(修改生成的POM)
生成的POM文件可能需要在發(fā)布之前進(jìn)行調(diào)整。 “maven-publish”插件提供了一個(gè)鉤子來(lái)允許這樣的修改。
Example 36.5. Modifying the POM file
build.gradle
publications {
mavenCustom(MavenPublication) {
pom.withXml {
asNode().appendNode('description',
'A demonstration of maven POM customization')
}
}
}
在這個(gè)例子中,我們?yōu)樯傻腜OM添加了一個(gè)'description'元素。 使用此鉤子,您可以修改POM的任何方面。 例如,您可以將依賴(lài)關(guān)系的版本范圍替換為用于生成構(gòu)建的實(shí)際版本。
有關(guān)更多信息,請(qǐng)參閱API文檔中的MavenPom.withXml(org.gradle.api.Action)。
實(shí)際上可以修改所創(chuàng)建的POM的任何方面。 這意味著也可以修改POM,使其不再是有效的Maven POM,因此在使用此功能時(shí)必須小心。
發(fā)布模塊的標(biāo)識(shí)符(groupId,artifactId,version)是一個(gè)例外; 這些值不能在POM中使用withXML
鉤子修改。
36.2.5. Publishing multiple modules(發(fā)布多個(gè)模塊)
有時(shí),您可以從Gradle構(gòu)建中發(fā)布多個(gè)模塊,而無(wú)需創(chuàng)建單獨(dú)的Gradle子項(xiàng)目。 一個(gè)例子是為您的庫(kù)發(fā)布單獨(dú)的API和實(shí)現(xiàn)jar。 使用Gradle這很簡(jiǎn)單:
Example 36.6. Publishing multiple modules from a single project
build.gradle
task apiJar(type: Jar) {
baseName "publishing-api"
from sourceSets.main.output
exclude '**/impl/**'
}
publishing {
publications {
impl(MavenPublication) {
groupId 'org.gradle.sample.impl'
artifactId 'project2-impl'
version '2.3'
from components.java
}
api(MavenPublication) {
groupId 'org.gradle.sample'
artifactId 'project2-api'
version '2'
artifact apiJar
}
}
}
如果一個(gè)項(xiàng)目定義了多個(gè)出版物,那么Gradle將會(huì)將這些發(fā)布到定義的存儲(chǔ)庫(kù)中。 每個(gè)出版物必須具有如上所述的唯一身份。
36.3. Repositories(倉(cāng)庫(kù))
出版物被發(fā)布到倉(cāng)庫(kù)。 發(fā)布到的存儲(chǔ)庫(kù)由 PublishingExtension.getRepositories()容器定義。
Example 36.7. Declaring repositories to publish to
build.gradle
publishing {
repositories {
maven {
// change to point to your repo, e.g. http://my.org/repo
url "$buildDir/repo"
}
}
}
用于聲明存儲(chǔ)庫(kù)以進(jìn)行發(fā)布的DSL是用于聲明存儲(chǔ)庫(kù)以從 RepositoryHandler使用依賴(lài)關(guān)系的DSL。 但是,在Maven發(fā)布的上下文中,只能使用 MavenArtifactRepository存儲(chǔ)庫(kù)進(jìn)行發(fā)布。
36.4. Performing a publish(執(zhí)行發(fā)布)
“maven-publish”插件會(huì)自動(dòng)為publisher.publications和publishing.repositories容器中的每個(gè)MavenPublication和MavenArtifactRepository組合創(chuàng)建一個(gè)PublishToMavenRepository任務(wù)。
創(chuàng)建的任務(wù)名為“發(fā)布”publish?PUBNAME?PublicationTo?REPONAME?Repository“。
Example 36.8. Publishing a project to a Maven repository
build.gradle
apply plugin: 'java'
apply plugin: 'maven-publish'
group = 'org.gradle.sample'
version = '1.0'
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}
publishing {
repositories {
maven {
// change to point to your repo, e.g. http://my.org/repo
url "$buildDir/repo"
}
}
}
Output of gradle publish
> gradle publish
:generatePomFileForMavenJavaPublication
:compileJava
:processResources NO-SOURCE
:classes
:jar
:publishMavenJavaPublicationToMavenRepository
:publish
BUILD SUCCESSFUL in 0s
4 actionable tasks: 4 executed
在此示例中,創(chuàng)建名為“publishMavenJavaPublicationToMavenRepository”的任務(wù),其類(lèi)型為PublishToMavenRepository。 此任務(wù)已連接到發(fā)布生命周期任務(wù)。 執(zhí)行“gradle publish”構(gòu)建POM文件和要發(fā)布的所有工件,并將它們傳輸?shù)酱鎯?chǔ)庫(kù)。
36.5. Publishing to Maven Local發(fā)布到本地maven倉(cāng)庫(kù))
為了與本地Maven安裝進(jìn)行集成,有時(shí)將模塊發(fā)布到本地.m2存儲(chǔ)庫(kù)中是有用的。 在Maven的說(shuō)法中,這被稱(chēng)為“安裝”模塊。 “maven-publish”插件通過(guò)在publishing.publications容器中為每個(gè) MavenPublication自動(dòng)創(chuàng)建一個(gè) PublishToMavenLocal任務(wù)來(lái)實(shí)現(xiàn)這一點(diǎn)。 每個(gè)這些任務(wù)都連接到publishToMavenLocal生命周期任務(wù)中。 你的publishing.repositories
部分不需要mavenLocal
。
創(chuàng)建的任務(wù)名為“publish?PUBNAME?PublicationToMavenLocal“。
Example 36.9. Publish a project to the Maven local repository
Output of gradle publishToMavenLocal
> gradle publishToMavenLocal
:generatePomFileForMavenJavaPublication
:compileJava
:processResources NO-SOURCE
:classes
:jar
:publishMavenJavaPublicationToMavenLocal
:publishToMavenLocal
BUILD SUCCESSFUL in 0s
4 actionable tasks: 4 executed
此示例中生成的任務(wù)名為“publishMavenJavaPublicationToMavenLocal”。 此任務(wù)已連接到publishToMavenLocal生命周期任務(wù)中。 執(zhí)行“gradle publishToMavenLocal”構(gòu)建POM文件和要發(fā)布的所有工件,并將它們“安裝”到本地Maven存儲(chǔ)庫(kù)中。
36.6. Generating the POM file without publishing
有時(shí)在實(shí)際發(fā)布時(shí)為模塊生成Maven POM文件是有用的。 由于POM生成由單獨(dú)的任務(wù)執(zhí)行,因此很容易實(shí)現(xiàn)。
生成POM文件的任務(wù)是GenerateMavenPom類(lèi)型,并且根據(jù)發(fā)布的名稱(chēng)給出一個(gè)名稱(chēng):“generatePomFileFor?PUBNAME?Publication“。 所以在下面的例子中,出版物名為“mavenCustom”,任務(wù)將被命名為“generatePomFileForMavenCustomPublication”。
Example 36.10. Generate a POM file without publishing
build.gradle
model {
tasks.generatePomFileForMavenCustomPublication {
destination = file("$buildDir/generated-pom.xml")
}
}
Output of gradle generatePomFileForMavenCustomPublication
> gradle generatePomFileForMavenCustomPublication
:generatePomFileForMavenCustomPublication
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
發(fā)布模型的所有細(xì)節(jié)仍然在POM生成中考慮,包括組件,自定義工件以及通過(guò)pom.withXml進(jìn)行的任何修改。
“maven-publish”插件利用了后期插件配置的一些實(shí)驗(yàn)支持,任何GenerateMavenPom任務(wù)將不會(huì)被構(gòu)建,直到配置發(fā)布擴(kuò)展。 當(dāng)您嘗試訪問(wèn)GenerateMavenPom任務(wù)時(shí),確保發(fā)布插件配置的最簡(jiǎn)單的方法是將訪問(wèn)放置在模型塊中,如上所述。
同樣適用于任何嘗試訪問(wèn)特定于發(fā)布的任務(wù),如PublishToMavenRepository.。 這些任務(wù)應(yīng)該在模型塊內(nèi)引用。
內(nèi)容如有錯(cuò)誤僅供參考,后續(xù)給出使用實(shí)例