我需要在我的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模拟器)它可以工作。
答案 0 :(得分:0)
Log4j使用注释处理器来处理自定义插件。
你可以尝试不排除吗?因此,从您的包装选项中删除: 排除'META-INF / services / javax.annotation.processing.Processor'