2017-11-29 26 views
11

Tôi đang di chuyển dự án sang Android Studio 3Gradle 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 
+0

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ã. –

+0

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. –

+0

@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

Trả lời

2

Dựa trên tài liệu này, đây là vấn đề đã biết:

https://developer.android.com/studio/build/gradle-plugin-3-0-0.html

Firebase plugin version 1.1.0 can cause a mismatch in Guava dependencies when using Android plugin 3.0.0-alpha5, resulting in the following error:

Dựa trên stacktrace, vấn đề nằm xung quanh plugin này, mặc dù tôi không coi đây là phụ thuộc được liệt kê trong tệp của bạn.

Nhưng giải pháp được đề xuất sẽ được loại trừ nó ra khỏi classpath:

dependencies { 
    classpath ('com.google.firebase:firebase-plugins:1.1.0') { 
      exclude group: 'com.google.guava', module: 'guava-jdk5' 
    } 
} 
+0

Tôi đã thực hiện thay đổi đó. Tôi nghĩ nó không liên quan đến điều đó, bởi vì nó nằm trong một mô-đun khác. – adalPaRi

0

As mentioned in this answer thử in classpath thực tế tại thời gian chạy.

Có vẻ như bạn có một số phiên bản khác của Ổi trên đường dẫn lớp. Tôi cũng sẽ kiểm tra xem có bất kỳ phụ thuộc nào của bạn có thuộc tính Class-Path trong tệp kê khai của chúng hay không. Ổi có thể được bao gồm theo cách đó mà không bị nổi lên trong các phụ thuộc Gradle.

0

NoClassDefFoundError không được gây ra do không tìm thấy lớp cụ thể, trong trường hợp đó một ClassNotFoundException sẽ xảy ra.

NoClassDefFoundError xảy ra khi lớp không thể tải khi chạy bởi trình nạp lớp. Vì vậy, lớp học được tìm thấy, nhưng một cái gì đó xấu xảy ra khi tải nó. Thông thường đây là một số công cụ tĩnh mà đi sai.

Thậm chí thông thường hơn đối với tôi, đây là lớp tải một dll hoặc một tệp. Thông thường vì việc thực hiện lớp là bản địa. Lỗi jni của bạn cho biết đây là những gì đang diễn ra. Vì vậy, trong trường hợp này, bạn sẽ cần phải tìm dll hoặc để đi với bình và thêm nó vào PATH hoặc LD_LIBRARY_PATH.

Sự cố này dường như minh họa cho người khác có vấn đề tương tự, khắc phục sự cố của chính mình sau: https://github.com/google/guava/issues/1533 Người đó không cụ thể trong giải thích của anh ấy, nhưng mô tả của họ về vấn đề "Vì tôi mới trong android tôi không biết các thư viện phải được đặt trong thư mục "libs" "là một dấu hiệu khác cho tôi, đây là những gì đang xấu.

Dù sao, đó là nơi NoClassDefFoundError đã làm phiền tôi trong quá khứ, đặc biệt là khi kết hợp với lỗi jni.

Nhưng, như đã nói, thường có điều gì đó không đúng trong mã tĩnh, giống như bất kỳ ngoại lệ không bị bắt buộc nào. Ví dụ, nó cũng có thể được gây ra bởi một lớp, trong mã tĩnh trong lớp đó, ví dụ: mở một số tệp và không xử lý ngoại lệ. Vì vậy, có lẽ những lời khuyên được liệt kê ở đây cũng có thể hữu ích: http://javareferencegv.blogspot.be/2013/10/debugging-javalangnoclassdeffounderror.html

0

hãy kiểm tra các file jar trong .WAR \ WEB-INF \ lib sau khi xây dựng có thể tìm thấy hai lớp với phiên bản khác nhau trong con đường này :)

Các vấn đề liên quan