jar和构建jar的任务之间的Spring Boot问题:Gradle

时间:2020-08-27 20:06:44

标签: spring-boot gradle spring-boot-gradle-plugin

现在我遇到了这个问题,我需要将SpringBoot应用程序转换为可执行jar,但这需要在任务中完成,而不仅仅是gradle.build中的配置。

因此,我的build.gradle中的以下代码段将生成一个可执行jar:

jar {
    manifest {
        attributes 'Main-Class': 'com.path.name.to.main.App'
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

一切正常,但是当我将jar创建为任务时,jar不再可以执行并抛出此错误错误:找不到或加载主类com.path.name.to.main.App

task makeJar(type: Jar) {
    archiveName = 'app.jar'
    manifest {
        attributes 'Main-Class': 'com.path.name.to.main.App'
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

与上述配置相反,建议在build.gradle中的任务中创建jar文件,这是我公司进行部署的方式。

但是,我不太确定为什么将其从jar配置移动到任务会影响已创建的实际jar的结果,我需要怎么做才能解决此问题?

1 个答案:

答案 0 :(得分:1)

首先,您所谈论的jar配置实际上是Jar类型的任务,它只是由Gradle创建的(很可能是由其Java plugin创建的)。检阅由适用于您的构建脚本的插件创建的任务的文档。

作为示例,您可以在创建任务makeJar之后,以与任务jar相同的方式访问任务:

task makeJar(type: Jar)

makeJar {
   // configuration things
}

与上述配置相反,建议在build.gradle中的任务中创建jar文件,这是我公司进行部署的方式。

知道jar也是一项任务,这表明您公司的这种部署策略根本没有意义。您可以以与手动创建的任务相同的方式配置和使用任务jar

但是,有时只用项目类和可执行的JAR来生成JAR文件是有意义的。由于jar任务已经产生了第一个任务,因此我们需要另一个任务来产生第二个任务。可执行JAR也称为胖uber JAR,实际上有一个really good plugin来创建它们。

您的实际问题的根源是,由于任务jar由Java插件创建,因此已对其自动应用了一些配置,从而丢失了任务makeJar。在from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }行中,compile配置内的所有项目依赖项都已添加到JAR中,但是您自己的项目中的代码丢失了。以下代码添加了常规jar任务的内容:

task makeJar(type: Jar) {
    archiveName = 'app.jar'
    manifest {
        attributes 'Main-Class': 'com.path.name.to.main.App'
    }
    with jar
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}