Gradleでmaven-publishプラグインを使用して、Spring Bootアプリケーションjarを公開しています。私は通常のタスクを実行します:./gradlew artifactorypublish
。ただし、次のエラーが表示されましたが、その意味は理解できました。
> Task :assembleArtifact
> Task :application-jar:compileJava UP-TO-DATE
> Task :application-jar:processResources UP-TO-DATE
> Task :application-jar:classes UP-TO-DATE
> Task :application-jar:jar SKIPPED
> Task :generateMetadataFileForMavenJavaPublication FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':generateMetadataFileForMavenJavaPublication'.
> Invalid publication 'mavenJava':
- Publication only contains dependencies and/or constraints without a version. You need to add minimal version information, publish resolved versions (https://docs.gradle.org/6.1/userguide/publishing_maven.html#publishing_maven:resolved_dependencies) or reference a platform (https://docs.gradle.org/6.1/userguide/platforms.html)
私のbuild.gradle:
plugins {
id 'org.springframework.boot' version '2.2.6.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'Java'
id 'maven-publish'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
publishing {
publications {
mavenJava(MavenPublication){
components.Java
}
}
}
...
バージョン:
Gradle 6.1
Spring Boot 2.2.6(主にSpring Boot Initializrから生成)
しばらくいじった後、私は解決策を見つけました:
publishing {
publications {
mavenJava(MavenPublication){
// bootJar is the default build task configured by Spring Boot
artifact bootJar
}
}
}
これは、components.Java
がデフォルトで設定されているためですJavaプラグインタスク:jar
またはwar
。ただし、Spring Bootの場合、プラグインを適用した後org.springframework.boot
、デフォルトタスクはbootJar
またはbootWar
になります。
(参考)Spring Boot docから:
実行可能なjarは、
bootJar
タスクを使用して構築できます。タスクは、Java
プラグインが適用されると自動的に作成され、BootJar
のインスタンスです。assemble
タスクは自動的にbootJar
タスクに依存するように構成されているため、assemble
(またはbuild
)を実行するとbootJar
タスクも実行されます。
したがって、アーティファクトはcomponents.Java
で正しく識別できませんでした。代わりにbootJar
またはbootWar
を指す必要があります。
@Nakamuraによって回答を拡張します。SpringbootLibraryになるプロジェクトを作成し、設定する必要がある場合:
bootJar {
enabled=false
}
jar {
enabled=true
}
以下を設定できます。
publishing {
publications {
mavenJava(MavenPublication){
// jar is the default build task configured by Spring Boot if bootJar=false
artifact jar
}
}
}