Tôi đang di chuyển dự án sang Android Studio 3 và Gradle 3.NoClassDefFoundError khi đang chạy
Chúng tôi có các mô-đun bội số, với các phụ thuộc khác nhau. Khi tôi biên dịch dự án, mọi thứ đều ổn.
Tôi có một mô-đun với các lớp thực thi (chính) để tạo một số báo cáo nội bộ. Vấn đề là bên trong nó, tôi đang sử dụng các phương pháp từ một mô-đun khác, và một trong số chúng đang ném NoClassDefFoundError. Nó hoạt động tốt trước khi di chuyển.
Dưới đây là các tệp gradle. Hãy nói rằng ModuleA là một thực thi, ModuleB là một trung gian, và ModuleC là một crashing:
ModuleA:
dependencies {
compile project(':ModuleB')
compile group: 'com.googlecode.protobuf-rpc-pro', name: 'protobuf-rpc-pro-duplex', version: '3.3'
testCompile "junit:junit:4.12"
}
sourceSets {
test {
java {
srcDirs = ['test']
}
resources {
srcDirs = ['test']
}
}
}
test {
afterTest { desc, result ->
println "Executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
}
workingDir = new File(rootProject.projectDir, '/Output')
jvmArgs "-Xmx1536m"
}
ModuleB:
dependencies {
compile project(':ModuleC')
compile project(':AnotherModule')
compile group: 'com.h2database', name: 'h2', version:'1.3.176'
compile group: 'com.google.code.gson', name: 'gson', version:'2.7'
compile group: 'org.json', name: 'json', version:'20080701'
}
ModuleC:
dependencies {
compile project(':AnotherModule')
compile project(':AnotherModule')
compile project(':AnotherModule')
compile group: 'org.slf4j', name: 'log4j-over-slf4j', version:'1.7.25'
compile group: 'org.slf4j', name: 'jul-to-slf4j', version:'1.7.25'
compile group: 'com.google.protobuf', name: 'protobuf-java', version:'2.6.1'
compile(group: 'com.google.inject', name: 'guice', version:'4.1.0', classifier:'no_aop') {
exclude(module: 'aopalliance')
}
compile(group: 'com.mortennobel', name: 'java-image-scaling', version:'0.8.6') {
exclude group: 'com.squareup.retrofit2', module: 'retrofit'
}
compile group: 'com.google.guava', name: 'guava', version: '19.0'
}
Lớp mà không thể được tìm thấy đang được sử dụng trong ModuleC: com.google.common.base.Joiner và nó phụ thuộc (ổi) nó được thêm vào bên trong nó là gradle tập tin
Đây là lỗi:
(1/124) RUNNING 'Internal check xxx'...
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Joiner
at com.degoo.util.FirebaseAnalyticsUtil.adjustTestKeyForFirebase(FirebaseAnalyticsUtil.java:35)
at com.degoo.util.FirebaseAnalyticsUtil.adjustPropertyString(FirebaseAnalyticsUtil.java:16)
at com.degoo.splittestrunner.SplitTestRunner.getQuery(SplitTestRunner.java:109)
at com.degoo.splittestrunner.SplitTestRunner.run(SplitTestRunner.java:67)
at com.degoo.splittestrunner.SplitTestRunner.main(SplitTestRunner.java:50)
Caused by: java.lang.ClassNotFoundException: com.google.common.base.Joiner
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) ... 5 more
Bất cứ ý tưởng gì có thể xảy ra? Cảm ơn rất nhiều!
EDIT:
Đây là cây phụ thuộc nếu tôi chạy gradlew. Ổi có mặt trong biên dịch, mặc định, runtime và vân vân ..
runtime - Runtime dependencies for source set 'main' (deprecated, use 'runtimeOnly ' instead).
+--- project :ProjectBackup
| +--- com.myapp:PackJPG:1.5
| +--- com.myapp:xz:1.2
| +--- org.ocpsoft.prettytime:prettytime:2.1.2.Final
| +--- joda-time:joda-time:2.1
| +--- project :ProjectCommon
| | +--- project :Utilities
| | +--- project :ProcessPriority
| | | +--- com.nativelibs4java:bridj:0.6.2
| | | | \--- com.google.android.tools:dx:1.7
| | | +--- net.java.dev.jna:jna:4.1.0
| | | +--- net.java.dev.jna:jna-platform:4.1.0
| | | | \--- net.java.dev.jna:jna:4.1.0
| | | +--- org.tinylog:slf4j-binding:1.2
| | | | +--- org.tinylog:tinylog:1.2
| | | | \--- org.slf4j:slf4j-api:[1.6,1.8) -> 1.7.25
| | | \--- project :Utilities
| | +--- project :ProjectHttp
| | | +--- commons-logging:commons-logging:1.2
| | | +--- org.tinylog:jcl-binding:1.2
| | | | +--- org.tinylog:tinylog:1.2
| | | | \--- commons-logging:commons-logging:[1.2,1.3) -> 1.2
| | | \--- commons-codec:commons-codec:1.10
| | +--- org.slf4j:log4j-over-slf4j:1.7.25
| | | \--- org.slf4j:slf4j-api:1.7.25
| | +--- org.slf4j:jul-to-slf4j:1.7.25
| | | \--- org.slf4j:slf4j-api:1.7.25
| | +--- com.google.protobuf:protobuf-java:2.6.1
| | +--- com.google.inject:guice:4.1.0
| | | +--- javax.inject:javax.inject:1
| | | \--- com.google.guava:guava:19.0
| | +--- org.bouncycastle:bcprov-jdk16:1.46
| | +--- com.mortennobel:java-image-scaling:0.8.6
| | | \--- com.jhlabs:filters:2.0.235
| | +--- com.google.guava:guava:19.0
| | \--- com.drewnoakes:metadata-extractor:2.9.1
| | \--- com.adobe.xmp:xmpcore:5.1.2
| +--- project :PackJPGInterFileCompression
| | +--- project :ProjectCommon (*)
| | \--- com.myapp:PackJPG:1.5
| +--- com.h2database:h2:1.3.176
| +--- com.google.code.gson:gson:2.7
| +--- org.json:json:20080701
| \--- itadaki:jbzip2:0.9.1
\--- com.googlecode.protobuf-rpc-pro:protobuf-rpc-pro-duplex:3.3
+--- com.google.protobuf:protobuf-java:2.6.1
+--- io.netty:netty-transport:4.0.23.Final
| \--- io.netty:netty-buffer:4.0.23.Final
| \--- io.netty:netty-common:4.0.23.Final
+--- io.netty:netty-common:4.0.23.Final
+--- io.netty:netty-handler:4.0.23.Final
| +--- io.netty:netty-buffer:4.0.23.Final (*)
| +--- io.netty:netty-transport:4.0.23.Final (*)
| \--- io.netty:netty-codec:4.0.23.Final
| \--- io.netty:netty-transport:4.0.23.Final (*)
+--- io.netty:netty-codec:4.0.23.Final (*)
\--- org.slf4j:slf4j-api:1.7.2 -> 1.7.25
Edit:
Chúng tôi có một trường hợp tương tự (các lỗi tương tự) nhưng với classloader và tinyLog
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/pmw/tinylog/writers/Writer
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: org.pmw.tinylog.writers.Writer
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)
... 7 more
Không sử dụng blockquote cho trường hợp ngoại lệ, nó làm hỏng định dạng và làm cho nó khó đọc. Vui lòng [sửa] bài đăng của bạn và sao chép/dán dấu vết ngăn xếp, sau đó định dạng dưới dạng mã. –
Kiểm tra xem cài đặt Proguard của bạn có làm xáo trộn các thư viện lớp được yêu cầu không. –
@CodeBullsInc. Như bạn thấy trong mã gradle, tôi không sử dụng proguard trong bất kỳ mô-đun nào. Tuy nhiên, tôi đang sử dụng proguard trong mô-đun khác có thể sử dụng mã trong ModuleC, nhưng không phải là keepeng com.google.common – adalPaRi