2017-05-16 8 views
0

Ich habe erstellt:Realm - Fehler: Nicht erfasster Übersetzungsfehler: java.lang.IllegalArgumentException: bereits hinzugefügt: Lio/realm/DefaultRealmModule;

1) Bibliothek-A, die Realm

apply plugin: 'com.android.library' 
apply plugin: 'realm-android' 

und 2) Projekt-A verwendet, das Reich und die Bibliothek-A verwendet; Project-A verwendet das Schema von Library-A nicht.

apply plugin: 'com.android.application' 
apply plugin: 'realm-android' 

Hauptprojekt gradle:

dependencies { 
    classpath "io.realm:realm-gradle-plugin:3.1.3" 
} 

Während bauen, bin Begegnung ich diese Fehler:

Error:Uncaught translation error: java.lang.IllegalArgumentException: already added: Lio/realm/DefaultRealmModule; 
Error:Uncaught translation error: java.lang.IllegalArgumentException: already added: Lio/realm/DefaultRealmModuleMediator; 
Error:2 errors; aborting 
Error:Execution failed for task ':x:transformClassesWithDexForDevDebug'. 
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: Return code 1 for dex process 

UPDATE: es scheint, dass es etwas falsch mit meinem Build-Setup, in weiter Das Hinzufügen des Plugins zur Bibliothek führte zu dem Fehler.

apply plugin: 'realm-android' 

Was verursacht diesen Fehler und wie soll ich ihn beheben? Vielen Dank!

+0

Haben Sie die von der Bibliothek verwendeten RealmObjects als '@ RealmModule' exponiert? – EpicPandaForce

+0

Nein. Ist es erforderlich, auch wenn das Projekt die RealmObjects der Bibliothek nicht verwendet? – sticky

+0

Offenbar ist es so, dass der Realm-Annotationsprozessor weiß, dass es eine Bibliothek ist. – EpicPandaForce

Antwort

1

Trennen Sie Ihre Modelle in Module.

Irgendwo in der Bibliothek erklären

// You can make this a singleton, annotations are the important part. 
@RealmModule(library = true, allClasses = true) 
class LibraryRealmModule {} 

Dadurch werden alle Modellklassen innerhalb dieser Bibliothek in LibraryRealmModule setzen.

Sie können dasselbe in Ihrem App-Projekt tun, aber wenn Sie keine Module angeben, wird ein Standardmodul für Sie generiert. Dieses generierte Modul enthält alle Modellklassen aus dem App-Projekt.

Dann, wenn Sie bauen die Realm Beispiel die folgende Konfiguration zur Verfügung stellen:

final LibraryRealmModule libRealmModule = new LibraryRealmModule(); 
final RealmConfiguration config = RealmConfiguration.Builder() 
     .name(Realm.DEFAULT_REALM_NAME) // Just a file name 
     .modules(Realm.getDefaultModule(), libRealmModule) // List all modules 
     .deleteRealmIfMigrationNeeded() // TODO Actually migrate data when in production! 
     .build() 
final Realm realm = Realm.getInstance(config); 

Anders als das Plugin Config ist richtig.

+0

In diesem Code wird davon ausgegangen, dass Sie sowohl Bibliotheks- als auch App-Modelle aus einem Realm verwenden. Wenn die Bibliothek einen anderen Bereich als das App-Projekt verwendet, müssen Sie a) einen anderen Bereichsnamen angeben, b) ein explizites Modul in der Bibliothek deklarieren. –

+0

Versucht, aber immer noch den gleichen Fehler. – sticky

+0

Dies ist die richtige Lösung, also muss etwas in Ihrem Build-Setup falsch sein, wenn das nicht funktioniert. –

0

Auf die Projektstruktur, die ich in dieser Frage gestellt hatte, behebt Eugens Antwort nicht direkt das Problem, dem ich begegnet bin, aber er ist richtig, dass ein RealmModul erstellt werden muss.

Eine weitere Bibliothek, Bibliothek-B (RealModule) wurde erstellt und enthielt die RealmObjects von Bibliothek-A und Projekt-A. Nach der Einstellung als Abhängigkeit von 2 wurde das Problem gelöst.

Verwandte Themen