web-dev-qa-db-ja.com

Gradle、Spring Boot、Maven Publish-パブリケーションには依存関係や制約のみが含まれ、バージョンはありません

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から生成)

3
Nakamura

しばらくいじった後、私は解決策を見つけました:

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を指す必要があります。

リファレンス: https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/html/#publishing-your-application-maven-publish

2
Nakamura

@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
        }
    }
}
1
Chayne P. S.