使用 gradle bootJar 而不是 jar 任务并在 Jenkins 中构建失败

Posted

技术标签:

【中文标题】使用 gradle bootJar 而不是 jar 任务并在 Jenkins 中构建失败【英文标题】:Use the gradle bootJar instead of jar task and build fails in Jenkins 【发布时间】:2018-11-11 03:54:42 【问题描述】:

在我的 gradle.build 文件中开始使用 spring boot gradle 插件后,在 jenkins 上构建失败。

classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.2.RELEASE")

本地运行良好,包括构建、测试和 web 应用程序在 Jetty 上运行良好。唯一的问题是 Jenkins 在任务 artifactoryPublish 上的构建失败。它说:

File '/var/lib/jenkins/jobs/release-my-project/workspace/build/libs/workspace-0.2.1-SNAPSHOT.jar' does not exists, and need to be published!

不确定 gradle artifactoryPublish 任务发生了什么。我认为任务来自 Jenkins。

在使用spring boot gradle插件之前,我在gradle.build中的jar任务如下:

jar 
    baseName = 'my-project'
    from 
        configurations.compile.collect 
            it.isDirectory() ? it : zipTree(it)
        
        configurations.runtime.collect 
            it.isDirectory() ? it : zipTree(it)
        
    
    manifest 
        attributes 'Main-Class':'com.example.Application'
    
    // Exclude manifest signature files
    exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/LICENSE'
   

由于spring boot gradle插件禁用了jar任务,换成了bootjar任务,所以我配置bootjar任务如下:

bootJar 
    baseName = 'my-project'
    mainClassName = 'com.example.Application'
    // Exclude manifest signature files
    exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/LICENSE'

我从 jenkins 日志中注意到的一件事是它说文件 workspace-0.2.1-SNAPSHOT.jar 不存在。似乎它正在寻找错误的文件。以前,它会查找正确的文件my-project-0.2.1-SNAPSHOT.jar。当我在本地构建时,创建了这个 jar 文件。不知道是什么让詹金斯寻找workspace-0.2.1-SNAPSHOT.jar。它应该是my-project,因为我在 bootJar 任务中定义了 baseName。

知道这里有什么问题吗?谢谢。

【问题讨论】:

【参考方案1】:

除非您明确定义项目名称,否则 Gradle 将使用目录名称作为项目名称。在 Jenkins 上,项目目录称为“工作区”。 artifactoryPublish 大概是使用项目名称来确定要发布的JAR文件的名称。如果是这种情况,那就不是好习惯。

无论如何,您确实应该设置项目的名称。然后,您不必在Jar 任务上显式设置baseName。只需在项目的根目录中添加一个 settings.gradle 文件,即在 build.gradle 文件旁边,并将其内容设置为:

rootProject.name = "my-project"

这应该有望解决问题,尽管这实际上取决于 artifactoryPublish 任务正在做什么。

【讨论】:

【参考方案2】:

我想扩展彼得的答案,Gradle 的作者建议我们应该使用settings.gradle

在设置文件中定义根项目名称:“rootProject.name”有效地为整个构建分配一个名称,用于构建扫描等报告。如果未设置根项目名称,则名称将是容器目录名称,可能是不稳定的(即您可以将您的项目签出到任何目录)。

【讨论】:

以上是关于使用 gradle bootJar 而不是 jar 任务并在 Jenkins 中构建失败的主要内容,如果未能解决你的问题,请参考以下文章

Gradle:由 gradle bootJar 任务创建的 jar 不起作用

Gradle kotlin Springboot多模块导致无法引用kotlin的类文件(BootJar)

Gradle kotlin Springboot多模块导致无法引用kotlin的类文件(BootJar)

使用 bootJar 行为覆盖项目的 jar 任务

Gradle 如何打包 Spring Boot 如何不添加版本代码

如何使用 Spring Boot“bootJar”插件创建 gradle 任务以生成爆炸性战争?