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

Spring Boot Issue between jar and task that build jar: 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 不再可执行并抛出此错误 错误:无法找到或加载主程序 class 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 的结果,我需要做什么来解决这个问题?

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

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

task makeJar(type: Jar)

makeJar {
   // configuration things
}

The way my company does deployments it is advisable to have the jar creation in a task in the build.gradle as opposed to the configuration mentioned above.

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

但是,有时生成仅包含项目 类 的 JAR 文件和可执行 JAR 是有意义的。由于 jar 任务已经产生了第一个,我们需要另一个任务来产生第二个。可执行 JAR 也称为 fat oder 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) } }
}