Gradle BootJar+;马文贾尔。人工制品不存在';此版本不会产生任何错误

Gradle BootJar+;马文贾尔。人工制品不存在';此版本不会产生任何错误,gradle,spring-boot-gradle-plugin,maven-publish,Gradle,Spring Boot Gradle Plugin,Maven Publish,我有一个具有以下层次结构的示例项目: Sample (root) -- model (simple jar) -- api (springboot jar) 我想将两个生成的jar:普通jar和bootJar发布到我的localRepository gradlew clean build -xTest publishToMavenLocal 但是,出现以下错误: * What went wrong: Execution failed for task ':api:pu

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

Sample (root)
   -- model (simple jar)
   -- api   (springboot jar)
我想将两个生成的jar:普通jar和bootJar发布到我的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.
根build.gradle是如下所示的:

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

apply plugin: 'org.springframework.boot'

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

bootJar {
}
将bootJava任务添加到api build.gradle允许直接从api模块发布bootJar,但根发布任务仍然处于中断状态

publishing {
    publications {
        bootJava(MavenPublication) {
            artifact bootJar
        }
    }
}
我尝试了docs&google的几乎所有解决方案,但似乎都不管用。 谁能解释一下,什么是错误配置


Gradle版本:6.3

如Gradle文档所述:

从Gradle 6.2开始,Gradle在上传之前执行健全性检查,以确保您不会上传过时的文件(由另一个版本生成的文件)。这会导致使用components.java组件上载的Spring引导应用程序出现问题

更多的解释可以在上面的链接中找到。 他们提出了我亲自尝试并为我工作的以下解决方案:

配置传出配置

configurations {
       [apiElements, runtimeElements].each {
           it.outgoing.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(jar) }
           it.outgoing.artifact(bootJar)
       }
    }
在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
            }
        }
    }
}
摘录

从Gradle6.2开始,Spring启动应用程序将禁用主任务,并且
组件希望它出现。由于默认情况下,
bootJar
任务使用与主任务相同的文件,Gradle的早期版本将:

  • 发布过时的
    bootJar
    工件
  • 或者,如果之前没有调用bootJar任务,则失败
简单的解决方法是配置传出配置。对于多模块Gradle项目,将以下配置放在服务模块(spring boot module)中

注意:如果
artifactory
任务配置正确,则无需对其进行任何更改。此工作溶液已通过Gradle 6.4.1测试

不要尝试他们提供的替代建议,因为在最新版本中,
分类器
属性已被弃用,使用自定义配置更改
bootJar
任务也会导致不正确的uberjar构造,如果提取生成的jar分布式,您可以找到缺少的
BOOT-INF
目录和必要的
META-INF/MANIFEST.MF

jar {
   enabled = true
}

bootJar {
   classifier = 'application'
}

更新:

从SpringBoot2.5.0开始,
jar
任务生成一个附加的jar归档文件,该文件以
-plain.jar
结尾。如果某人使用了一些模式(如
*.jar
)来复制构建档案,则可能会破坏其构建,因此,为了限制额外的jar创建,应使用以下
jar
任务配置代码片段

jar {
    enabled = false
}

我可以通过如下所示在发布任务中添加
artifact bootJar
,而不添加gradle文档中建议的任何配置来实现这一点。我相信这可能与他们在文档中的第一个解决方法相同。用gradle测试
6.5.1

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifact bootJar
            artifact sourceJar {
                classifier "sources"
            }
        }
    }
}

project.tasks.publish.dependsOn bootJar

根据下的“Gradle”文件

只需将以下内容添加到
build.gradle
文件

jar {
   enabled = true
}

bootJar {
   classifier = 'application'
}

如果您使用的是gradle kotlin dsl,请在build.gradle中添加等效项。它对我有用

 configurations {
    val elements = listOf(apiElements, runtimeElements)
    elements.forEach { element ->
        element.get().outgoing.artifacts.removeIf { it -> it.buildDependencies.getDependencies(null).contains(tasks.jar.get())}
        element.get().outgoing.artifact(tasks.bootJar.get())
    }
}

与Gradle 5.3配合使用效果良好:-(你能分享额外的信息吗?它放在哪里?我收到的消息是无法将提供的符号转换为ConfigurablePublishArtifactNote类型的对象:在多模块项目中,“配置”块应该在具有bootjar任务的模块中。没有一个解决方案适用于bootWar任务。知道吗?
配置中的附加行{}
对我来说是有效的,在我的情况下是GradleV6.5。
 configurations {
    val elements = listOf(apiElements, runtimeElements)
    elements.forEach { element ->
        element.get().outgoing.artifacts.removeIf { it -> it.buildDependencies.getDependencies(null).contains(tasks.jar.get())}
        element.get().outgoing.artifact(tasks.bootJar.get())
    }
}