Мое приложение требует 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. Это действительно смутило меня. Кто-нибудь может помочь? Спасибо!