Gradle实现与在jar任务中进行编译

时间:2019-01-29 00:42:07

标签: jar build.gradle executable-jar

我可以成功地使用 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) } }
}

1 个答案:

答案 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也为我工作。