【发布时间】:2019-09-10 03:56:22
【问题描述】:
我的应用程序需要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的新手。这真的让我很困惑。任何人都可以帮忙吗?谢谢!
【问题讨论】: