代码之家  ›  专栏  ›  技术社区  ›  J.E.Tkaczyk

Gradle实现与jar任务中的编译

  •  0
  • J.E.Tkaczyk  · 技术社区  · 6 年前

    我可以成功地使用 编译胖JAR,但是在最近从“compile”依赖规范切换到“implementation/api”规范之后,在运行JAR时遇到了问题。我发现问题只发生在以下两种情况中的一种。应用程序在IntelliJ中运行。

    第一个/问题:

    dependencies {implementation 'no.tornado:tornadofx:1.7.18'}
    

    二次/工程:

    dependencies {compile'no.tornado:tornadofx:1.7.18'}
    

    JAR在这两种情况下都可以编译。当我试图在命令行上启动第一个case JAR时,问题出现了,它抛出了以下错误。

    C:\aaa\u eric\code\testr\mic\build\libs>java-jar麦克风-1.0-snapshot.jar 错误:无法找到或加载主类app.MyApp 原因: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 回复  |  直到 6 年前
        1
  •  6
  •   Brian Graves    6 年前

    改变 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'
    }
    

    需要注意的是 配置.compileClasspath.collect compile 规范而不是 implement .