首页 > 解决方案 > jar和构建jar的任务之间的Spring Boot问题:Gradle

问题描述

现在我遇到了这个问题,我需要将我的 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) } }
}

我公司的部署方式建议在任务中创建 jar,build.gradle而不是上面提到的配置。

但是,我不确定为什么将它从jar配置移到任务会影响创建的实际 jar 的结果,我需要做些什么来解决这个问题?

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

解决方案


首先,jar您所说的配置实际上是 type 的任务Jar,它只是由 Gradle 创建的(很可能是由它的Java 插件创建的)。查看有关由应用于构建脚本的插件创建的任务的文档。

例如,您可以在创建makeJar任务后以与任务相同的方式访问您的任务jar

task makeJar(type: Jar)

makeJar {
   // configuration things
}

我公司的部署方式建议在任务中创建 jar,build.gradle而不是上面提到的配置。

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

但是,有时同时生成仅包含项目类和可执行 JAR 的 JAR 文件是有意义的。由于jar任务已经产生了第一个,我们需要另一个任务来产生第二个。可执行的 JAR 也称为 fat oder uber JAR,实际上有一个非常好的插件可以创建它们。

您的实际问题的根源是 task 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) } }
}

推荐阅读