我需要使用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仿真器)它可以工作。
這似乎是與https://realm.io/docs/java/latest/#類似的問題jackson-databind,你可以請嘗試創建一個虛擬的'Observable'在那裏描述? – beeender
試了兩個,添加rxjava庫或只是Observable類。還是一樣的錯誤。我現在注意到日誌中有很多「Cold not find method/class ...」。我想知道我是否使用了某些依賴關係的錯誤版本。 –
我試着將log4j2添加到我的項目中。沒有看到崩潰。你是如何在項目中使用log4j2的?或者你可以與我們分享測試項目嗎?如果您想私下分享,可以發送給[email protected]。否則,在任何我能得到它的地方分享它。 – beeender