S-JIS[2023-06-22/2023-10-011] 変更履歴

Gradle maven-publishプラグイン

Gradleのmaven-publishプラグインは、生成されたjarファイル類を公開する。


概要

maven-publishプラグインは、生成されたjarファイル類をMavenリポジトリーに公開する。

build.gradle:

plugins {
    id "maven-publish"
    id "signing"
}

〜

publishing {
    〜
}

Mavenセントラルリポジトリーにpublishする例

maven-publishプラグインで公開の為の情報を設定する。

以下、Mavenセントラルリポジトリーにpublishする為の設定の例。

Mavenセントラルリポジトリーにjarファイルをアップロードする際は、sources.jarとjavadoc.jarも必要らしい。
javaブロックにwithSouresJar()とwithJavadocJar()を指定することで、sources.jarとjavadoc.jarが生成される。

build.gradle(Gradle6):

plugins {
    id "java"
    id "maven-publish"
    id "signing"
}

group = 'io.github.hishidama.embulk'
version = '0.1.0'

sourceCompatibility = 8
targetCompatibility = 8
compileJava.options.encoding = 'UTF-8'

java {
    withJavadocJar()
    withSourcesJar()
}

javadoc {
    options.charSet = 'UTF-8'
    options.encoding = 'UTF-8'
}

〜

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId = 'hm-embulk-tester'
            from components.java

            pom {
                name = 'hm-embulk-tester'
                description = 'Tool to test Embulk plugin'
                url = 'https://github.com/hishidama/hm-embulk-tester'
                licenses {
                    license {
                        name = 'The Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id = 'hishidama'
                    }
                }
                scm {
                    connection = 'git@github.com:hishidama/hm-embulk-tester.git'
                    developerConnection = 'git@github.com:hishidama/hm-embulk-tester.git'
                    url = 'https://github.com/hishidama/hm-embulk-tester'
                }
            }
        }
    }
    repositories {
        maven {
            url = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
            credentials {
                username = findProperty('sonatypeUsername')
                password = findProperty('sonatypePassword')
            }
        }
    }
}

signing {
    required { gradle.taskGraph.hasTask("publishMavenJavaPublicationToMavenRepository") }
    sign publishing.publications.mavenJava
}

repositoriesブロックに、publish先である「Mavenセントラルリポジトリーのステージング環境」のURLと認証情報(Sonatypeのアカウント)を指定する。
ユーザー名やパスワードはbuild.gradleに直接書くとGitHub等にpushしたときに公開されてしまうので、公開しないgradle.propertiesに書いておき、それを参照するようにする。
build.gradle上の書き方として、 「"${sonatypeUsername}"」だとsonatypeUsernameプロパティーが存在していないとエラーになるので(単なるビルドすらエラーになる)、findProperty()の方が良さそう。[2023-10-01]

また、Mavenセントラルリポジトリーでソフトウェアを公開する際は、電子署名が必要となる。
電子署名にはsigningプラグインを使用する。(publishを実行すると、拡張子ascのファイルが作られる)

(Mavenセントラルリポジトリーのステージング環境に)アップロードするコマンド

./gradlew publish

Mavenリポジトリーをpomに指定する方法

Mavenセントラルリポジトリー以外のMavenリポジトリーを使う場合、build.gradleのrepositoriesにそのリポジトリーを指定する。[2023-10-01]

repositories {
    mavenCentral()
    maven { url 'https://asakusafw.s3.amazonaws.com/maven/releases' }
}

ビルド自体はこれで問題ないが、mvnコマンドで依存ライブラリーをダウンロードする際はMavenセントラルリポジトリーからしかダウンロードされない為、Mavenセントラルリポジトリー以外のライブラリーを含んだpomファイルだとエラーになる。
mvnコマンドの引数ではMavenリポジトリーを指定できないようだが、pomファイル内にはrepositoriesを記述することが出来る。
ただし、Gradleのpublishingのpomブロックにはrepositoriesが用意されていないので、withXmlを使って記述する。

    publications {
        mavenJava(MavenPublication) {
〜
            pom {
〜
                withXml {
                    def repositoriesNode = asNode().appendNode('repositories')
                    def repositoryNode = repositoriesNode.appendNode('repository')
                    repositoryNode.appendNode('id', 'asakusafw')
                    repositoryNode.appendNode('url', 'https://asakusafw.s3.amazonaws.com/maven/releases')
                }
            }
        }
    }

↓生成されたbuild/publications/mavenJava/pom-default.xmlの末尾

  <repositories>
    <repository>
      <id>asakusafw</id>
      <url>https://asakusafw.s3.amazonaws.com/maven/releases</url>
    </repository>
  </repositories>
</project>

Gradle目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま