gradleを7.2にアップデートした際にmaven
プラグインをmaven-publish
に置き換えた。spring-bootアプリケーションのjarをpublishが出来るようになるまでそこそこ苦労したので過程などを残しておく。
環境
- gradle 7.2
- java 11
- spring-boot 2.5.4
ソースコード - 最終的なbuild.gradle
plugins { id 'org.springframework.boot' version '2.5.4' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'maven-publish' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { useJUnitPlatform() } publishing { publications { mavenJava(MavenPublication) { artifact bootJar } } repositories { maven { def releasesRepoUrl = 'https://artifactory.rakuten-it.com/firstparty-mvn-release-local/' def snapshotsRepoUrl = 'https://artifactory.rakuten-it.com/firstparty-mvn-snapshot-local/' url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl credentials { username project.properties.userId password project.properties.apiKey } } } }
publish関連のタスクはこんな感じ。ざっくりな説明だと、publishToMavenLocal
でlocalに、publish
でremoteにpublishする。
Publishing tasks ---------------- app:generateMetadataFileForMavenJavaPublication - Generates the Gradle metadata file for publication 'mavenJava'. app:generatePomFileForMavenJavaPublication - Generates the Maven POM file for publication 'mavenJava'. app:publish - Publishes all publications produced by this project. app:publishAllPublicationsToMavenRepository - Publishes all Maven publications produced by this project to the maven repository. app:publishMavenJavaPublicationToMavenLocal - Publishes Maven publication 'mavenJava' to the local Maven repository. app:publishMavenJavaPublicationToMavenRepository - Publishes Maven publication 'mavenJava' to Maven repository 'maven'. app:publishToMavenLocal - Publishes all Maven publications produced by this project to the local Maven cache.
試行錯誤の過程など
以下は、あれこれ試行錯誤して発生したエラーとその解消方法、ドキュメントのリンクなどを示す。
まずmaven
をmaven-publish
に変更してrepositoriesなどの書き方を修正した。
publishing { repositories { maven { def releasesRepoUrl = 'https://artifactory.rakuten-it.com/firstparty-mvn-release-local/' def snapshotsRepoUrl = 'https://artifactory.rakuten-it.com/firstparty-mvn-snapshot-local/' url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl credentials { username project.properties.userId password project.properties.apiKey } } } }
これを実行したところpublish
しても何も起きない。
> Task :app:publish UP-TO-DATE Skipping task ':app:publish' as it has no actions.
ちゃんと調べて無いのだけど https://stackoverflow.com/questions/61500897/gradle-springboot-mavenpublish-publication-only-contains-dependencies-and-or のように書く必要があるらしい。このへん https://docs.gradle.org/current/userguide/upgrading_version_6.html#publishing_spring_boot_applications も参照。
publishing { publications { mavenJava(MavenPublication) { artifact bootJar } } repositories { maven { def releasesRepoUrl = 'https://artifactory.rakuten-it.com/firstparty-mvn-release-local/' def snapshotsRepoUrl = 'https://artifactory.rakuten-it.com/firstparty-mvn-snapshot-local/' url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl credentials { username 'username' password 'password' } } } }
この状態でlocalにpublishするためpublishToMavenLocal
を実行する。
> gradlew app:publishToMavenLocal -i ... > Task :app:publishMavenJavaPublicationToMavenLocal ... Publishing to maven local repository
これで{M2}\com\example\app\0.0.1-SNAPSHOT
にjarが作られる。