java - Gradle依赖问题,java.lang.NoClassDefFoundError,但是编译通过

标签 java exception gradle build

这里是 gradle 和 java 的新手,我正在尝试使用 android.util.Log 中的 Android 日志方法。看来我可以编译并找到它需要的东西,但它在运行时找不到它。我尝试在依赖项部分中使用“运行时”而不是“编译”,但运气不佳。

java -jar build/libs/testJavaHttp.jar

Exception in thread "main" java.lang.NoClassDefFoundError: android/util/Log
        at myproject.test.HttpToFile.downloadFile(HttpToFile.java:20)
        at myproject.test.Main.main(Main.java:12)
Caused by: java.lang.ClassNotFoundException: android.util.Log
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 2 more
<小时/>

在 build.gradle 中

apply plugin: 'java'

dependencies {
    compile files('../androidsdk/platforms/android-25/android.jar')
}

jar {
    manifest {
        attributes 'Main-Class': 'myproject.test.Main'
    }
}

最佳答案

您正在尝试运行该 jar,但该 jar 未包含依赖项,请使用 Shadow jar 插件或通过扩展 jar 任务来打包所需的工件。

jar {
    archiveName = 'Name.jar'

    manifest {
         attributes 'Main-Class': 'myproject.test.Main',
                'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' '),
                'Implementation-Version': 1.0
    }

    from(configurations.myconfig.collect { it.isDirectory() ? it : zipTree(it) }) {
           // in here you can exclude what you need as well if needed.
           }
}

为了不将“整个世界”放入 jar 中,您可以仅使用所需的库创建配置:

configurations{
    myconfig // to create configuration
    compile.extendsFrom(myConfig) //to include it in compile as well
}

然后在 jar 创建和依赖项中使用此配置。

dependencies {
    myconfig files('../androidsdk/platforms/android-25/android.jar')
}

但是看看你的代码,没有什么可拉的。如果您希望它是一个可运行的 jar,那么您需要考虑打包所有需要的工件和传递性,因为您使用“java -jar [...]”命令运行它。

PS。编译中的所有内容也将包含在运行时配置中。

关于java - Gradle依赖问题,java.lang.NoClassDefFoundError,但是编译通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44154138/

相关文章:

java - Fitnesse Framework 在决策表中使用正则表达式?

c# - 这段代码怎么可能: "ArgumentOutOfRangeException: startIndex cannot be larger than length of string"?

c++ - 为什么要捕获异常作为对 const 的引用?

java - DynamicReports 不在页面开始处打印列标题

java - 当主应用程序 JFrame 最小化时最小化辅助 JFrame

java - 将字符串比较为 null 或空时返回 boolean 值

c# - 任务线程中抛出的异常,未被 UnobservedTaskException 捕获

java - 我如何告诉 Gradle 包含一个本地库 jar,而该库 jar 又具有依赖项?

java - res/drawable/abc_ic_ab_back_material.xml Resources$NotFoundException 上的 Kitkat

gradle - 在Gradle 3.5中替换WAR文件中的资源文件