2014-05-23 13 views
8

Sto utilizzando Gradle nella mia applicazione Android e vorrei utilizzare la dipendenza della libreria JScience. Ho aggiunto la biblioteca in questo modo:Gradle: Come escludere il pacchetto javax.realtime dalla dipendenza di JScience jar (definizione dex multipli)

dependencies { 
    compile fileTree(dir: 'libs', include: '*.jar') 

    compile 'org.jscience:jscience:4.3.1' 

    testCompile group: 'junit', name: 'junit', version: '4.11' 
} 

Ma nel momento della compilazione ottengo l'errore:

UNEXPECTED TOP-LEVEL EXCEPTION: 
com.android.dex.DexException: Multiple dex files define Ljavax/realtime/MemoryArea; 
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594) 
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552) 
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533) 
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170) 
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188) 
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439) 
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287) 
    at com.android.dx.command.dexer.Main.run(Main.java:230) 
    at com.android.dx.command.dexer.Main.main(Main.java:199) 
    at com.android.dx.command.Main.main(Main.java:103) 

Questo è causato a causa di duplicare javax.realtime pacchetti in progetto, uno è una parte di JDK, e il secondo è nella libreria di Jscience. Ho provato a rimuovere questo pacchetto dalla libreria Jscience in questo modo in Gradle:

sourceSets { 
    main { 
     java { 
      exclude 'javax/realtime/**' 
     } 
    } 
} 

configurations { 
    all*.exclude group: 'javax.realtime' 
} 

Ma questo non ha aiutato. Quindi, quel pacchetto è ancora esistente nelle dipendenze. enter image description here

Esiste un modo per escludere un pacchetto da jar in fase di compilazione?

+2

"uno è una parte di Java" - non c'è 'javax.realtime' in Android. Il fatto che la libreria di classi di un JDK abbia 'javax.realtime' è priva di significato, poiché non si sta utilizzando la libreria di classi di JDK durante la compilazione di un'app Android. – CommonsWare

+0

Grazie per la risposta, sei corretto al 100%, errore mio. Il problema era in dipendenza da javolution (che proviene dalla libreria JScience), perché contiene il pacchetto 'javax.realtime'. –

risposta

16

Nel caso in cui qualcuno ne avesse bisogno, il problema era nella dipendenza Javolution dalla libreria JScience. Entrambi hanno un pacchetto javax.runtime. Escludendo il Javolution ho risolto il problema per me.

compile ('org.jscience:jscience:4.3.1') { 
    exclude group: 'org.javolution', module: 'javolution' 
} 
+0

Grazie per questo. Non sono riuscito a trovare le dipendenze sovrapposte per il solito percorso 'gradle -q app: dependencies' -> quale comando hai usato per scavare nell'applicazione se posso chiedere? – AllDayAmazing

+0

Non ricordo già, ma penso che forse una sorta di comando 'gradle dependencies' o albero delle dipendenze di Intellij Idea –

+0

Grazie per questo. Questo ha risolto il mio problema con "java.exe terminato con valore di uscita diverso da zero 2". – Ralphilius