我可以成功地使用 Gradle 来编译胖的JAR,但是在最近从“编译”依赖项规范切换到“实现/ api”规范之后,运行JAR遇到了麻烦。我已隔离出仅在以下两种情况中的一种会出现此问题。无论哪种情况,该应用程序都可以在IntelliJ中运行。
第一个/问题:
dependencies {implementation 'no.tornado:tornadofx:1.7.18'}
秒/作品:
dependencies {compile'no.tornado:tornadofx:1.7.18'}
在两种情况下均会编译JAR。当我尝试在命令行上启动第一种情况JAR时,会出现问题,并引发以下错误。
C:\ aaa_eric \ code \ testr \ mic \ build \ libs> java -jar mic-1.0-snapshot.jar 错误:找不到或加载主类应用程序。 引起原因:java.lang.NoClassDefFoundError:tornadofx / App
这是build.gradle中的JAR任务。 tornadofx依赖关系是否有可能在编译时可用,但在运行时不可用?感谢您的帮助。
jar {
manifest {
attributes 'Main-Class': 'app.MyApp'
}
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
答案 0 :(得分:3)
将configurations.compile.collect
更改为configurations.compileClasspath.collect
可以解决我的问题。
我遇到了同样的问题,在https://docs.gradle.org/current/javadoc/org/gradle/api/artifacts/ConfigurationContainer.html中偶然发现了这个问题:
显示在名称中如何通过名称引用给定配置的示例 来获取所有依赖项(例如jar,但仅限)
apply plugin: 'java' //so that I can use 'implementation', 'compileClasspath' configuration dependencies { implementation 'org.slf4j:slf4j-api:1.7.26' } //copying all dependencies attached to 'compileClasspath' into a specific folder task copyAllDependencies(type: Copy) { //referring to the 'compileClasspath' configuration from configurations.compileClasspath into 'allLibs' }
要注意的一件事是,即使我使用configurations.compileClasspath.collect
规范而不是compile
时,implement
也为我工作。