2016-05-29 7 views
6

Projekt enthält Annotationsprozessor, der während der Kompilierung Java-Code generiert. In der Standardeinstellung generierten die grodle-Ausgaben Quelldateien in das Verzeichnis build/classes. Dies führt zu einigen Problemen bei der Erkennung neu generierter Quelldateien durch IntelliJ.Ausgabeverzeichnis des generierten Codes in Großbuchstaben ändern

Gibt es eine einfache Möglichkeit, Gradle so zu konfigurieren, dass Quelldateien in ein anderes Verzeichnis ausgegeben werden? Zum Beispiel $buildDir/gen/main/java oder $buildDir/build/generated/main/java?

Antwort

9

Es gibt eine Option für den Java-Compiler, mit der das Ausgabeverzeichnis für generierte Java-Quellen angepasst werden kann (documentation).

es dir

das Verzeichnis angeben, wo die Dateien zu platzieren erzeugen Quelle. Das Verzeichnis muss bereits existieren. javac wird es nicht erstellen. Wenn eine Klasse Teil eines Pakets ist, fügt der Compiler die Quelldatei in ein Unterverzeichnis ein, das den Paketnamen widerspiegelt und Verzeichnisse nach Bedarf erstellt. Wenn Sie beispielsweise -s C: \ mysrc angeben und die Klasse com.mypackage.MyClass heißt, wird die Quelldatei in C: \ mysrc \ com \ mypackage \ MyClass.java platziert.

Beispiel 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" 
     } 
    } 
} 

Dieser Code-Schnipsel tut nächste:

  • erstellt und legt Verzeichnis als Ausgang für generierten Code
  • löscht erzeugt Quellen, wenn saubere Aufgabe aufgerufen wird
  • fügt neuen Quellensatz hinzu

aktualisieren

Verwenden gradle apt plugin statt.

+0

Danke für die Lösung - es funktioniert gut für mich, mit einem Tweak in, dass ich es vorziehe, die generierten Dateien in '$ project.buildDir/generated/java' zu setzen, da dies bedeutet, dass Sie sich keine Sorgen machen müssen wie sauber funktioniert. Außerdem scheint es nicht nötig zu sein, eine Quellmenge hinzuzufügen, die trotzdem funktioniert. –

+0

Wenn sonst bei nachfolgenden Kompilierungen ein Java-Kompilierfehler auftritt .. fügen Sie dem doFirst-Block Folgendes hinzu: 'GFileUtils.cleanDirectory (directory); '.. abhängig von Ihrer Version von Gradle müssen Sie möglicherweise' FileUtils.cleanDirectory' – Darwayne

+0

@ PetterMåhlen verwenden, warum die Konfiguration von sourceSet optional ist? Gradle benötigt es, um jar zu erstellen, das die generierten Klassen enthält. – Sunnyday

1

Einfach Wert angeben, für project.buildDir Eigenschaft in Ihrer build.gradle Datei:

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

Dadurch werden alle generierten Dateien setzen bauen auf den <project_root>/gen/main/java Ordner.

+0

Dies ist nicht die beste Lösung, da nicht nur generierte, sondern auch Build-Ausgaben des Compilers in diesem Verzeichnis abgelegt werden (.class-Dateien und andere Dinge, die Sie nicht in Ihrem Quellcode haben wollen). –