2016-05-29 16 views
6

Il progetto contiene un processore di annotazioni che genera codice java durante la compilazione. Per impostazione predefinita, gli output gradle hanno generato file sorgente nella directory build/classes. Ciò causa alcuni problemi con la scoperta di file sorgenti appena generati da IntelliJ.Cambia la directory di output del codice generato nel gradle

Esiste un modo semplice per configurare gradle per l'output dei file sorgente in un'altra directory? Ad esempio $buildDir/gen/main/java o $buildDir/build/generated/main/java?

risposta

9

Esiste un'opzione per il compilatore java che consente di personalizzare la directory di output per le origini java generate (documentation).

-s dir

Specificare la directory in cui posizionare i file di origine generati. La directory deve già esistere; javac non lo creerà. Se una classe è una parte di un pacchetto, , il compilatore pone il file sorgente in una sottodirectory che riflette il nome del pacchetto, creando le directory secondo necessità. Per esempio , se si specifica -s C: \ mysrc e la classe è chiamata com.mypackage.MyClass, il file di origine verrà inserito in C: \ mysrc \ com \ mypackage \ MyClass.java.

Esempio di build.gradle

compileJava { 
    options.compilerArgs << "-s" 
    options.compilerArgs << "$projectDir/generated/java" 

    doFirst { 
     // make sure that directory exists 
     file(new File(projectDir, "/generated/java")).mkdirs() 
    } 
} 

clean.doLast { 
    // clean-up directory when necessary 
    file(new File(projectDir, "/generated")).deleteDir() 
} 

sourceSets { 
    generated { 
     java { 
      srcDir "$projectDir/generated/java" 
     } 
    } 
} 

Questo frammento di codice fa successivo:

  • crea e specifica directory di output per il codice generato
  • elimina fonti generate se un'attività pulita viene richiamato
  • aggiunge un nuovo set di origini

Aggiornamento

Usa Gradle apt plugin invece.

+0

Grazie per la soluzione, funziona benissimo per me, con un ritocco in cui preferisco mettere i file generati in '$ project.buildDir/generated/java', poiché ciò significa che non devi preoccuparti di cambiare quanto funziona pulito. Inoltre, non sembra esserci la necessità di aggiungere effettivamente un set sorgente, che funziona comunque. –

+0

Se qualcun altro esegue un errore di compilazione java sulle ricompilazioni successive, aggiungere quanto segue al blocco doFirst: 'GFileUtils.cleanDirectory (directory); '.. A seconda della versione di gradle potrebbe essere necessario utilizzare' FileUtils.cleanDirectory' – Darwayne

+0

@ PetterMåhlén, perché la configurazione di sourceSet è facoltativa? gradle ha bisogno di esso per costruire jar che include le classi generate. – Sunnyday

1

Basta specificare il valore per project.buildDir proprietà nel file build.gradle:

project.buildDir = '/gen/main/java' 

Questo metterà tutti generati costruire i file nella cartella <project_root>/gen/main/java.

+0

Questa non è la soluzione migliore, dal momento che non solo viene generato, ma anche l'output di compilazione del compilatore verrà inserito in quella directory (i file .class e altre cose che non si desidera siano nel codice sorgente). –

Problemi correlati