Java 使用gradlebootjar而不是jar任务,在Jenkins中构建失败

Java 使用gradlebootjar而不是jar任务,在Jenkins中构建失败,java,spring-boot,jenkins,gradle,build,Java,Spring Boot,Jenkins,Gradle,Build,在我开始在gradle.build文件中使用spring boot gradle插件后,jenkins的构建失败了 classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.2.RELEASE") 在本地运行良好,包括构建、测试和webapp在Jetty上运行良好。唯一的问题是任务artifactoryPublish中的Jenkins上的构建失败。它说: File '/var/lib/jenkins/jobs/relea

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

classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.2.RELEASE")
在本地运行良好,包括构建、测试和webapp在Jetty上运行良好。唯一的问题是任务
artifactoryPublish
中的Jenkins上的构建失败。它说:

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
任务发生了什么。我想这个任务是詹金斯干的

在使用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'
}   
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'
}
由于spring boot gradle插件禁用jar任务,并将其替换为bootJar任务,因此我将bootJar任务配置如下:

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'
}   
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文件。不确定是什么让jenkins寻找
workspace-0.2.1-SNAPSHOT.jar
。它应该是
我的项目
,因为我在bootJar任务中定义了baseName


知道这里怎么了吗?谢谢。

除非您明确定义项目名称,否则Gradle将使用目录名作为项目名称。在Jenkins上,项目目录称为“工作区”
artifactoryPublish
可能使用项目名称来确定要发布的JAR文件的名称。如果是这样的话,那就不是好的做法

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

rootProject.name = "my-project"

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

我想扩展Peter的答案,Gradle的作者建议我们使用

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