gradle maven-publish Failed to publish Artifact xxx.jar wasn‘t produced by this build.

卢晟
2023-12-01

异常信息

Execution failed for task ':gradle-demo:publishMavenJavaPublicationToMavenRepository'.
> Failed to publish publication 'mavenJava' to repository 'maven'
   > Artifact gradle-demo-1.0.jar wasn't produced by this build.

说明

  • 环境说明
    我使用的是Gradle 6.6.1
C:\Users\herion>gradle -v
------------------------------------------------------------
Gradle 6.6.1
------------------------------------------------------------

Build time:   2020-08-25 16:29:12 UTC
Revision:     f2d1fb54a951d8b11d25748e4711bec8d128d7e3

Kotlin:       1.3.72
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.8 compiled on May 10 2020
JVM:          1.8.0_211 (Oracle Corporation 25.211-b12)
OS:           Windows 10 10.0 amd64
  • Gradle maven-publish 配置说明
apply plugin: 'maven-publish'

 publishing {
        publications {
            mavenJava(MavenPublication) {
                from components.java
                versionMapping {
                    usage('java-api') {
                        fromResolutionOf('runtimeClasspath')
                    }
                    usage('java-runtime') {
                        fromResolutionResult()
                    }
                }
            }
        }
        repositories {
            maven {
                // change URLs to point to your repos, e.g. http://my.org/repo
                def releasesRepoUrl = "http://ops.xxx.com/nexus/repository/maven-releases"
                def snapshotsRepoUrl = "http://ops.xxx.com/nexus/repository/maven-snapshots"
                url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
                credentials {
                    username nexusUser
                    password nexusPassword
                }
            }
        }
    }

错误原因分析

官方解释:

  • 发布Spring Boot应用程序
    从Gradle 6.2开始,Gradle会在上传之前执行健全性检查,以确保您没有上传陈旧的文件(由另一个构建生成的文件)。这会导致使用该components.java组件上传的Spring Boot应用程序出现问题:
Artifact my-application-0.0.1-SNAPSHOT.jar wasn't produced by this build.

这是由于以下事实造成jar的:Spring Boot应用程序禁用了主要任务,并且组件希望该任务存在。由于默认情况下该bootJar任务使用与主jar任务相同的文件,因此Gradle的早期版本将:

  • 发布陈旧的bootJar工件
  • 或如果bootJar以前未调用过任务则失败

详情请参考官方说明

解决方法

官方给我们提供了一些解决方案

  • (推荐)一种解决方法是告诉Gradle上传什么。如果要上传bootJar,则需要配置传出配置以执行此操作。对于多模块Gradle项目,将以下配置放在服务模块(spring boot模块)中:
configurations {
   [apiElements, runtimeElements].each {
       it.outgoing.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(jar) }
       it.outgoing.artifact(bootJar)
   }
}
  • artifactory如果任务配置正确,则无需更改任何任务。此工作解决方案已通过进行了测试Gradle 6.4.1,配置如下
publishing {
    publications {
        mavenJava(MavenPublication) {
            artifact bootJar
            artifact sourceJar {
                classifier "sources"
            }
        }
    }
}

project.tasks.publish.dependsOn bootJar
  • (不推荐)另外一种是您可能想重新启用jar任务,并bootJar使用其他分类器添加,配置如下:
jar {
   enabled = true
}

bootJar {
   classifier = 'application'
}

注意:不推荐使用这种方式,因为该classifier属性在最新版本中已被弃用,并且bootJar使用自定义配置更改任务也会导致不正确的超级jar构造,并且如果解压缩生成的jar分发版,则可能会找到缺少的BOOT-INF目录并必要的 META-INF/MANIFEST.MF值。

 类似资料:

相关阅读

相关文章

相关问答