kagamihogeの日記

kagamihogeの日記です。

spring-bootアプリケーションでgradleのmavenからmaven-publishに書き換え

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.

試行錯誤の過程など

以下は、あれこれ試行錯誤して発生したエラーとその解消方法、ドキュメントのリンクなどを示す。

まずmavenmaven-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が作られる。