2014-04-04 9 views
14

Vorrei modificare l'ordine delle librerie nel classpath per Android Studio. Sto provando a test unità di corsa con JUnit 4 da all'interno dell'IDE. Funziona seguendo lo instruction in these slides.Come configurare l'ordine delle librerie nel classpath per Android Studio?

mi chiedo se sia possibile configurare l'ordine delle librerie - altri poi suggerito nelle diapositive - tramite la configurazione Run di Android Studio?

Il primo tentativo è stato quello di cambiare l'ordine delle dipendenze nella finestra di dialogo Progetto Struttura nella scheda Dipendenza del modulo di progetto come mostrato nello screenshot.

Project Structure

La seconda ipotesi è stato quello di comprendere la configurazione classpath nel file build.gradle. Ci sono un paio di vaghe idee su questo:

sourceSets.main.compileClasspath = file("foo.jar") + sourceSets.main.compileClasspath 

...

sourceSets.test.compileClasspath = configurations.robo + sourceSets.test.compileClasspath 
sourceSets.test.runtimeClasspath = configurations.robo + sourceSets.test.runtimeClasspath 
  • Fonti: [1], [2]
+0

Puoi risolverlo tramite gradle: http://stackoverflow.com/a/38743046/715269 – Gangnus

risposta

1

È necessario modificare il file di progetto .iml avere JDK come ultima voce simile al seguente:

<orderEntry type="library" 
       exported="" 
       scope="TEST" 
       name="wagon-provider-api-1.0-beta-6" 
       level="project" /> 
    <orderEntry type="library" 
       exported="" 
       scope="TEST" 
       name="xercesMinimal-1.9.6.2" 
       level="project" /> 
    <!-- make sure this is the last orderEntry --> 
    <orderEntry type="jdk" 
       jdkName="Android API 19 Platform" 
       jdkType="Android SDK" /> 
    </component> 
</module> 

Per un esempio di lavoro completa vedere deckard-gradle campione di Robolectric.

+1

Ma: * "Android Studio riscrive in modo aggressivo l'elenco delle dipendenze (il tuo file .iml) e sovverte la tecnica usata sopra per scarica l'SDK di Android nella parte inferiore del classpath. Riceverai l'eccezione Stub! temuta ogni volta che riapri il progetto (e possibilmente più spesso). "* - [Source] (https://github.com/robolectric)/deckard-gradle) – JJD

+0

Sì, sfortunatamente non sembra esserci un buon lavoro in giro per Android Studio :(. Immagino sia per questo che raccomandano Intellij per ora. –

+0

Si potrebbe scrivere una sceneggiatura simile a quella delle diapositive menzionata nella mia domanda che poi si aggancia al processo di compilazione e aggiorna il '.iml' al momento giusto. – JJD

6

Io uso il seguente compito di fare in modo che la dipendenza SDK è elencato scorso:

task pushDownJdkDependency { 
    def imlFile = file("ui.iml") 
    doLast { 
     try { 
      def parsedXml = (new XmlParser()).parse(imlFile) 
      def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' } 

      parsedXml.component[1].remove(jdkNode) 
      new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': "Android API 18 Platform", 'jdkType': 'Android SDK']) 
      def writer = new StringWriter() 
      new XmlNodePrinter(new PrintWriter(writer)).print(parsedXml) 
      imlFile.text = writer.toString() 

     } catch (FileNotFoundException e) { 
      // nop, iml not found 
     } 
    } 
} 

Assicurarsi di utilizzare l'identificatore SDK corretto. Quindi agganciare l'attività nel processo di creazione:

gradle.projectsEvaluated { 
    preBuild.dependsOn(pushDownJdkDependency) 
} 

Oltre a ciò, aggiungere l'attività alla configurazione di esecuzione. Purtroppo non posso pubblicare immagini a causa della mancanza di reputazione.

+0

Se carichi le immagini da qualche parte, sono felice di modificare il tuo post e includerli per te. – JJD

+0

Grazie per questo. Non ha funzionato per me fino a quando ho rimosso la parte 'doLast' ... Immagino che farlo fosse troppo tardi per qualche motivo? – phreakhead

+0

Peccato che dobbiamo risolvere in qualcosa del genere con Android Studio:/Ma grazie mille per questa soluzione, potrebbe tornare utile! – icyerasor

Problemi correlati