BootJar + MavenJar.不是由此版本产生的工件 [英] BootJar + MavenJar. Artifact wasn't produced by this build

查看:234
本文介绍了BootJar + MavenJar.不是由此版本产生的工件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有以下层次结构的示例项目:

I have a sample project with the following hierearhy:

Sample (root)
   -- model (simple jar)
   -- api   (springboot jar)

我要发布两个生成的jar:普通jar和bootJar到我的localRepository.

I want to publish both generated jars: plain jar & bootJar to my localRepository.

gradlew clean build -xTest publishToMavenLocal    

但是,发生以下错误:

* What went wrong:
Execution failed for task ':api:publishMavenJavaPublicationToMavenLocal'.
> Failed to publish publication 'mavenJava' to repository 'mavenLocal'
   > Artifact api.jar wasn't produced by this build.

root build.gradle如下:

The root build.gradle is a follows:

plugins {
    id 'java'
    id "org.springframework.boot" version "2.2.5.RELEASE" apply false
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
}
group 'sample'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}
ext {
    artifactVersion = version
    springBootVersion = "2.2.5.RELEASE"
}

allprojects {
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'maven'
    tasks.withType(JavaCompile) {
        options.encoding = 'UTF-8'
    }
    repositories {
        mavenCentral()
        jcenter()
    }
}

subprojects {
    apply plugin: "io.spring.dependency-management"
    apply plugin: "maven-publish"

    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8

    dependencyManagement {
        imports {
            mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
        }
    }
    dependencies {
        implementation "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
    }

    publishing {
        publications {
            mavenJava(MavenPublication) {
                groupId project.group
                artifactId project.name
                version project.version

                from components.java
            }
        }
    }
}

api build.gradle

api build.gradle

apply plugin: 'org.springframework.boot'

dependencies {
    compile project(":model")
    implementation "org.springframework.boot:spring-boot-starter-web"
}

bootJar {
}

将bootJava任务添加到api build.gradle允许直接从api模块发布bootJar,但是根发布任务仍然无效.

Adding bootJava task to api build.gradle allowes to publish the bootJar directly from api module, but the root publish task remains broken.

publishing {
    publications {
        bootJava(MavenPublication) {
            artifact bootJar
        }
    }
}

我已经尝试了docs&的几乎所有解决方案谷歌,但似乎没有工作. 谁能解释一下什么配置错误?

I've tried almost every solution from docs & google, but none seem to work. Can anyone explain, what is misconfigured?

Gradle版本:6.3

Gradle version: 6.3

推荐答案

如gradle文档所述这里:

As stated by gradle documentation here:

从Gradle 6.2开始,Gradle会在上传之前执行健全性检查,以确保您没有上传过时的文件(由另一版本生成的文件).这就引入了使用component.java组件上传的Spring Boot应用程序的问题

Starting from Gradle 6.2, Gradle performs a sanity check before uploading, to make sure you don’t upload stale files (files produced by another build). This introduces a problem with Spring Boot applications which are uploaded using the components.java component

更多说明可在上面的链接中找到. 他们提出了以下我自己尝试并为我工作的变通办法:

More explanation is available in the link above. They propose the following workaround that I personally tried and worked for me :

配置传出配置

configurations {
       [apiElements, runtimeElements].each {
           it.outgoing.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(jar) }
           it.outgoing.artifact(bootJar)
       }
    }

在我的build.gradle中进行配置后:

here after the configuration from my build.gradle:

....
apply plugin: 'maven-publish'
...

configurations {
    [apiElements, runtimeElements].each {
        it.outgoing.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(jar) }
        it.outgoing.artifact(bootJar)
    }
    ....
}


publishing {
    publications {
        myPublication(MavenPublication) {
            groupId groupId
            artifactId artifactId
            version version
            from components.java
            versionMapping {
                usage('java-api') {
                    fromResolutionOf('runtimeClasspath')
                }
                usage('java-runtime') {
                    fromResolutionResult()
                }
            }
        }
    }
    repositories {
        maven {
            url azureRepoUrl
            name azureRepoName
            credentials {
                username azureRepoUserName
                password azureRepoAccessToken
            }
        }
    }
}

这篇关于BootJar + MavenJar.不是由此版本产生的工件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆