Android上的Realm.io与log4j2有问题

时间:2016-03-08 21:00:16

标签: realm log4j2

我需要在我的Android应用程序中使用log4j(v2),但它似乎与realm.io发生冲突。我创建了一个虚拟项目来重现这个问题,当我包含log4j-core时,我得到异常java.lang.NoClassDefFoundError:io.realm.rx.RealmObservableFactory。但是,如果我注释掉log4j-core导入,它就会运行。请注意,我的代码尚未使用log4j,它只是将其包含在gradle文件中。

这是我的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

更新 当我部署到我的Jelly Bean(API 16)模拟器时,会发生上述错误。实际上,这个错误发生在API 19之前。在API 21(似乎没有API 20模拟器)它可以工作。

1 个答案:

答案 0 :(得分:0)

Log4j使用注释处理器来处理自定义插件。

你可以尝试不排除吗?因此,从您的包装选项中删除: 排除'META-INF / services / javax.annotation.processing.Processor'