使用Gradle的maven-publish插件发布快照
我最近與Gradle一起開始了一個新項目 ,并決定直接參加–沒有Gradle經驗,沒有關于Groovy的線索,沒有教程,只是繼續嘗試直到可行。 在我決定使用孵化式maven-publish插件將快照發布到Sonatype的Maven快照存儲庫之前,這一切進展得令人驚奇,這確實令人信服。
警告:正如我說的那樣,我在Groovy和Gradle中都是菜鳥,所以不要相信我所說的話。 我為您寫下來的一切。
最后(但仍是部分的)的build.gradle文件可以找到這里 ,我在我的項目中使用的實際變異這里 。
第一步,確保存在項目的組,ID和版本。 通常可以在build.gradle文件中找到第一個和最后一個,項目名稱的ID會加倍,并在settings.gradle中定義。
激活
好了,走吧! 首先,我激活了插件:
apply plugin: 'maven-publish'要開始發布內容,我需要以下內容:
publishing {publications {mavenJava(MavenPublication) {from components.java// more goes in here}}repositories {mavenLocal()} }如您所見,我首先發布到本地倉庫。 事實上,運行gradle publish現在應該創建一個JAR,并在一些一個基本POM。 m2個子文件夾。 從這里開始,我可以逐步添加更多功能。
填充POM
發布工件需要什么? 完整的Maven pom。 由于我沒有pom.xml ,我在哪里可以得到它? 我用一些Gradle XML API創建它。 明顯。 為什么不使用Maven直接獲得pom? 如果我知道該死的...
因此,在mavenJava里面mavenJava東西(這是什么?我想是一個任務?),我創建了pom。 在解決以下語法之前,我花了一些時間嘗試這種方式:
pom.withXml {asNode().with {appendNode('packaging', 'jar')appendNode('name', 'PROJECT_NAME')appendNode('description', 'PROJECT_DESCRIPTION')appendNode('url', 'PROJECT_URL')appendNode('scm').with {appendNode('url', 'SCM_URL_FOR_PEOPLE')appendNode('connection', 'SCM_URL_FOR_SCM')}appendNode('issueManagement').with {appendNode('url', 'ISSUE_TRACKER_URL')appendNode('system', 'ISSUE_TRACKER_NAME')}appendNode('licenses').with {appendNode('license').with {appendNode('name', 'LICENSE_NAME')appendNode('url', 'LICENSE_URL')}}appendNode('organization').with {appendNode('name', 'ORG_NAME')appendNode('url', 'ORG_URL')}appendNode('developers').with {appendNode('developer').with {appendNode('id', 'DEV_HANDLE')appendNode('name', 'DEV_NAME')appendNode('email', 'DEV_MAIL')appendNode('organization', 'ORG_NAME_AGAIN')appendNode('organizationUrl', 'ORG_URL_AGAIN')appendNode('timezone', 'UTC_OFFSET')}}} }好,我們去。 比丑陋的XML好得多,對吧? 我在某處讀到有更多美麗的API可以在這里使用,但我不想離開另一個切線。 隨意提出一些建議。
您可能已經注意到,無需重復項目組,ID和版本。 現在,運行gradle publish應該發布帶??有完整的pom的JAR,盡管它有點丑陋。
許可及更多
我想將項目的許可證添加到JAR的META-INF文件夾中,因此在mavenJava我告訴Gradle在每個JAR任務中都包含該文件(或者至少是我閱讀的方式):
tasks.withType(Jar) {from(project.projectDir) {include 'LICENSE.md'into 'META-INF'} }看起來不錯, gradle publish現在會創建一個完整的pom和一個帶有項目許可證的JAR。
來源和Javadoc JAR
不過,大多數項目都希望發布的不僅僅是已編譯的.class文件,即源代碼和Javadoc。 為此,我添加了兩個任務,并從mavenJava引用了它們:
publishing {publications {mavenJava(MavenPublication) {// ...artifact sourceJarartifact javadocJar}}// ... }task sourceJar(type: Jar, dependsOn: classes) {classifier 'sources'from sourceSets.main.allSource }task javadocJar(type: Jar, dependsOn: javadoc) {classifier = 'javadoc'from javadoc.destinationDir }很好,現在我得到了一個完整的pom,一個用于項目的類和許可證的工件,以及用于源代碼和Javadoc的JAR。 是時候采取最后一步了:發布到快照倉庫!
為此,我將使用實際的存儲庫替換mavenLocal 。 除了URL,我還需要指定我的憑據:
repositories {maven {url 'https://oss.sonatype.org/content/repositories/snapshots/'credentials {username 'user'password '123456'}} }當然,我并不打算將密碼提交給源代碼管理,所以我一直在尋找替代方法。 我找到了一個-不確定它是否是最好的,但是,嘿,它有用。
您可以使用-P選項在命令行上定義新的項目屬性。 所以給這樣的命令...
gradle publish -P snapshotRepoPass=123456…然后我可以訪問項目。 憑據中的snapshotRepoPass :
credentials {username 'user'password project.snapshotRepoPass }甜。
直到我意識到現在所有其他任務都失敗了,因為始終創建credentials對象,因此需要存在屬性snapshotRepoPass 。 對于其他任務,除了發布之外,情況并非如此,因為我認為沒有理由將回購密碼傳遞給例如測試運行。 如此,我決定在構建文件中定義該屬性( 如果由于命令行選項而尚未定義):
ext {// the password needs to be specified via command linesnapshotRepoPass = project.hasProperty('snapshotRepoPass')? project.getProperty('snapshotRepoPass'): ''// it looks like the ternary operator can not actually be// split across lines; I do it here for artistic purposes }我本可以將相同的hasProperty/ getProperty檢查放入憑據中,但決定在實現此行為的地方創建一個單獨的位置。
完成所有這些操作后,我確實可以將項目的當前狀態發布到Sonatype Maven快照存儲庫。 哇!
反射
總而言之,這實際上并不是那么糟糕。 該文檔有點稀疏,并在API中構建了XML文件,這使它變得更加冗長,讓人感到荒謬,但除此之外,它讀起來也很簡單。 當時不是,但是現在可以了,所以我應該停止抱怨了。
這是我所做的:
- 使用apply plugin :' maven-publish '激活插件,并向build.gradle添加一個publishing節點。
- 用漂亮的asNode.appendNode調用填充pom
- 通過將復制步驟附加到每個與JAR相關的任務中來包括許可證
- 創建源和Javadoc JAR的任務,并從publications節點引用它們。
- 指定存儲庫URL并添加您的憑據。
如前所述,您可以簽出生成的build.gradle文件的兩個版本: 一個示例性的版本, 其中包括我們在此構建的內容和實際的交易 。
我還成功設置了Travis CI,以發布每個成功的版本,并將很快嘗試發布實際版本。 我會寫關于這兩者的...
翻譯自: https://www.javacodegeeks.com/2016/12/publishing-snapshots-gradles-maven-publish-plugin.html
總結
以上是生活随笔為你收集整理的使用Gradle的maven-publish插件发布快照的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 21端口被占用解决办法(21端口ddos
- 下一篇: 谷歌guava_Google Guava