现在我遇到了这个问题,我需要将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的结果,我需要怎么做才能解决此问题?
答案 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) } }
}