[英]How to add classpath to Gradle JavaExec task to execute a runnable jar?
我的应用程序需要spring-context
库。 因此,在我的build.gradle
文件中,添加了此依赖项,
dependencies {
compile 'org.springframework:spring-context:5.1.6.RELEASE'
}
我还想创建一个可运行的jar文件,这个jar
任务看起来像,
jar {
manifest {
attributes 'Main-Class': 'my.package.my.main.class'
}
}
启动构建文件时一切正常,
gradle build
但是当我尝试执行这个可运行的jar应用程序时,
task runJar(dependsOn: jar, type: JavaExec) {
classpath(configurations.compile)
main = '-jar'; args 'build/libs/my-runnable.jar'
}
控制台抛出NoClassDefFoundError
,
Exception in thread "main" java.lang.NoClassDefFoundError:
org/springframework/context/ConfigurableApplicationContext
...
...
我试过了sourceSets.main.runtimeClasspath
,问题仍然存在,
task runJar(dependsOn: jar, type: JavaExec) {
classpath(sourceSets.main.runtimeClasspath)
main = '-jar'; args 'build/libs/my-runnable.jar'
}
我检查了classpath
文件集合,
classpath.each {
println it.name
}
spring-context
包就在那里,
spring-context-5.1.6.RELEASE.jar
spring-aop-5.1.6.RELEASE.jar
spring-beans-5.1.6.RELEASE.jar
spring-expression-5.1.6.RELEASE.jar
spring-core-5.1.6.RELEASE.jar
spring-jcl-5.1.6.RELEASE.jar
然后,我尝试了另一种解决方法。 我从这些.jar
库中提取了所有类文件,并将它们直接包含在最终的runnable.jar
,
jar {
manifest {
attributes 'Main-Class': 'my.package.my.main.class'
}
configurations.compile.each {
from(project.zipTree(it))
}
}
并且此解决方案有效。 但是这样的“胖子”不是我想要的。
我是gradle的新手。 这真的让我感到困惑。 有人可以帮忙吗? 谢谢!
经过大约3个小时的工作,一个简单的事实是:
当指定-jar时,-cp参数将被忽略。
这个问题有一些详细的讨论:
有两种简单的解决方案:
.class
文件直接提取到您的可执行jar中。 jar {
manifest {
attributes 'Main-Class': 'my.package.my.main.class'
}
configurations.compile.each {
from(project.zipTree(it))
}
}
manifest
文件中添加Class-Path
参数。 jar {
manifest {
attributes 'Main-Class': 'your.main.class.full.name'
attributes 'Class-Path': configurations.compile.collect { it.name }.join(' ')
}
}
确保可以在本地系统中找到.jar
库。 例如,只需将它们复制到同一目录中,
task copyLibs(type: Copy) {
from configurations.compile
into 'build/libs/'
}
之后,我的build/libs/
目录如下所示:
build
├── libs
│ ├── my-runnable-app.jar
│ ├── spring-aop-5.1.6.RELEASE.jar
│ ├── spring-beans-5.1.6.RELEASE.jar
│ ├── spring-context-5.1.6.RELEASE.jar
│ ├── spring-core-5.1.6.RELEASE.jar
│ ├── spring-expression-5.1.6.RELEASE.jar
│ └── spring-jcl-5.1.6.RELEASE.jar
请注意,所有.jar
库都位于my-runnable-app.jar
。 如果要将它们包括在my-runnable-app.jar
,则需要One-Jar
工具箱。 有关One-Jar
更多信息,请阅读以下问题:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.