2016-03-08 45 views
2

我需要使用log4j(v2)爲我的android應用程序,但它似乎與realm.io非常嚴重衝突。我創建了一個虛擬項目來重現這個問題,當我包含log4j-core時,我得到了java.lang.NoClassDefFoundError異常:io.realm.rx.RealmObservableFactory。但是,如果我註釋掉log4j-core導入,它會運行。請注意,我的代碼還沒有使用log4j,它只是將它包含在它的gradle文件中。Realm.io在android上有問題log4j2

這是我的gradle文件。

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 

    dexOptions { 
     incremental true 
     javaMaxHeapSize "4g" 
    } 

    packagingOptions { 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/services/javax.annotation.processing.Processor' 
    } 

    defaultConfig { 
     applicationId "com.myapp.myapplication" 
     minSdkVersion 16 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
     multiDexEnabled true 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:23.2.0' 
    compile 'io.realm:realm-android:0.87.5' 
    compile 'com.android.support:design:23.2.0' 
    compile 'de.mindpipe.android:android-logging-log4j:1.0.3' 
    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.5' 

    //commenting the following line will make the app run 
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.5' 

    compile 'com.android.support:support-v4:23.2.0' 
    compile 'com.google.android.gms:play-services-ads:8.4.0' 
    compile 'com.google.android.gms:play-services:8.4.0' 
    compile 'com.android.support:recyclerview-v7:23.2.0' 
    compile 'com.android.support:multidex:1.0.0' 
    compile 'org.greenrobot:eventbus:3.0.0' 
    compile 'org.jsoup:jsoup:1.8.3' 
} 

這是我的活動。

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    //The below line crashes! 
    RealmConfiguration.Builder r = new RealmConfiguration.Builder(getBaseContext()); 
    } 
... 
} 

這是我得到的例外。

FATAL EXCEPTION: main 
java.lang.NoClassDefFoundError: io.realm.rx.RealmObservableFactory 
    at io.realm.RealmConfiguration$Builder.<init>(RealmConfiguration.java:279) 
    at com.myapp.myapplication.MainActivity.onCreate(MainActivity.java:23) 
    at android.app.Activity.performCreate(Activity.java:5008) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
    at android.app.ActivityThread.access$600(ActivityThread.java:130) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4745) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    at dalvik.system.NativeStart.main(Native Method) 

任何輸入讚賞!

更新 我的第一個想法也是去掉Remko建議的'排除'聲明,但這使得構建失敗。把這個'排除'出來給這個構建錯誤。

FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. 
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/services/javax.annotation.processing.Processor 
    File1: C:\Users\fgagn_000\.gradle\caches\modules-2\files-2.1\io.realm\realm-android\0.87.5\ab4e1fead1380252dad0e95658e53ea0c113e89c\realm-android-0.87.5.jar 
    File2: C:\Users\fgagn_000\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-core\2.5\7ed845de1dfe070d43511fab321784e6c4118398\log4j-core-2.5.jar 

更新 如上所述,當我部署到我的果凍豆(API 16)仿真器發生錯誤。事實上,這個錯誤發生在API 19之上。在API 21(似乎沒有API 20仿真器)它可以工作。

+0

這似乎是與https://realm.io/docs/java/latest/#類似的問題jackson-databind,你可以請嘗試創建一個虛擬的'Observable'在那裏描述? – beeender

+0

試了兩個,添加rxjava庫或只是Observable類。還是一樣的錯誤。我現在注意到日誌中有很多「Cold not find method/class ...」。我想知道我是否使用了某些依賴關係的錯誤版本。 –

+0

我試着將log4j2添加到我的項目中。沒有看到崩潰。你是如何在項目中使用log4j2的?或者你可以與我們分享測試項目嗎?如果您想私下分享,可以發送給[email protected]。否則,在任何我能得到它的地方分享它。 – beeender

回答

0

Log4j使用註釋處理器來處理自定義插件。

你可以嘗試不排除嗎?因此,從您的打包選項中刪除: 排除'META-INF/services/javax.annotation.processing.Processor'