Gradle依赖问题,java.lang.NoClassDefFoundError,但编译

时间:2017-05-24 09:18:28

标签: java exception gradle build

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

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

1 个答案:

答案 0 :(得分:0)

您正在尝试运行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创建和dependecies中使用此配置。

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

但是看看你的代码并没有那么多。如果你希望它是一个可运行的jar,你需要考虑打包所有需要的工件和传递,就像用'java -jar [...]'命令运行它一样。

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