Gradle依赖项问题,java.lang.NoClassDefFoundError,但编译
这里是gradle和java的新手,我正在尝试从Android.util.Log使用Android的Log方法。看起来我可以编译,它可以找到它需要的东西,但它在运行时找不到。在依赖项部分,我尝试使用“运行时”而不是“编译”,但运气不好Gradle依赖项问题,java.lang.NoClassDefFoundError,但编译,java,exception,gradle,build,Java,Exception,Gradle,Build,这里是gradle和java的新手,我正在尝试从Android.util.Log使用Android的Log方法。看起来我可以编译,它可以找到它需要的东西,但它在运行时找不到。在依赖项部分,我尝试使用“运行时”而不是“编译”,但运气不好 java -jar build/libs/testJavaHttp.jar Exception in thread "main" java.lang.NoClassDefFoundError: android/util/Log at myproj
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
内建gradle
如果您试图运行jar,而jar中没有打包依赖项,请通过扩展jar任务,使用shadow 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.编译中的所有内容都将包含在运行时配置中。如果您试图运行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.编译中的所有内容都将包含在运行时配置中。您的IDE可以编译,但您的Gradle不能,因为您没有指定您的类路径。如果未使用IDE,则可能会使用您可以检查的选项,下面是构建调试消息。注意类路径。。。。18:41:36.330[调试][org.gradle.api.internal.tasks.compile.normalizationjavacompiler]编译器参数:-source 1.8-target 1.8-d/Users/myname/dev/testJavaHttp/build/classes/main-g-sourcepath-proc:none-XDuseUnsharedTable=true-classpath/Users/myname/dev/androidsdk/platforms/android-25/android.jar/Users/myname/dev/testJavaHttp/src/main/java/myproject/test/HttpToFile.java/Users/myname/dev/testJavaHttp/src/main/java/myproject/test/main.java添加属性“类路径”:“../androidsdk/platforms/android-25/android.jar”似乎也不起作用。您的IDE可以编译,但您的Gradle不能,因为您没有指定您的类路径。如果未使用IDE,则可以检查,这是构建调试消息。注意类路径。。。。18:41:36.330[调试][org.gradle.api.internal.tasks.compile.normalizationjavacompiler]编译器参数:-source 1.8-target 1.8-d/Users/myname/dev/testJavaHttp/build/classes/main-g-sourcepath-proc:none-XDuseUnsharedTable=true-classpath/Users/myname/dev/androidsdk/platforms/android-25/android.jar/Users/myname/dev/testJavaHttp/src/main/java/myproject/test/HttpToFile.java/Users/myname/dev/testJavaHttp/src/main/java/myproject/test/main.java添加属性“类路径”:“../androidsdk/platforms/android-25/android.jar”似乎也不起作用。线程“main”java.lang.RuntimeException中的异常:存根!在myproject.test.Main.Main(Main.java:12)的myproject.test.HttpToFile.downloadFile(HttpToFile.java:20)的android.util.Log.d(Log.java:23)中,这似乎也将整个世界拉入了困境。您现在遇到的错误是另一个错误,可能是您的代码问题,您所发布的问题应该通过我建议的解决方案进行修复,您可以进一步调查它在您的主应用程序中失败的原因和原因。我更新了答案,给出了一个不把“整个世界”拉进罐子的例子。线程“main”java.lang.RuntimeException中的异常:存根!在myproject.test.Main.Main(Main.java:12)的myproject.test.HttpToFile.downloadFile(HttpToFile.java:20)的android.util.Log.d(Log.java:23)中,这似乎也将整个世界拉入了困境。您现在遇到的错误是另一个错误,可能是您的代码问题,您所发布的问题应该通过我建议的解决方案进行修复,您可以进一步调查它在您的主应用程序中失败的原因和原因。我更新了答案,给出了一个不将“整个世界”放入罐子的例子。