項目包含註釋處理器,它在編譯期間生成Java代碼。默認情況下,gradle輸出生成源文件到build/classes
目錄。這會導致IntelliJ發現新生成的源文件時出現一些問題。更改gradle中生成代碼的輸出目錄
是否有任何直接的方式配置gradle輸出源文件到另一個目錄?例如$buildDir/gen/main/java
或$buildDir/build/generated/main/java
?
項目包含註釋處理器,它在編譯期間生成Java代碼。默認情況下,gradle輸出生成源文件到build/classes
目錄。這會導致IntelliJ發現新生成的源文件時出現一些問題。更改gradle中生成代碼的輸出目錄
是否有任何直接的方式配置gradle輸出源文件到另一個目錄?例如$buildDir/gen/main/java
或$buildDir/build/generated/main/java
?
java編譯器有一個選項,可以爲生成的java源文件自定義輸出目錄(documentation)。
-s DIR
指定的目錄存放生成的源文件。 目錄必須已經存在; javac不會創建它。如果某個類是 程序包的一部分,則編譯器將源文件放入反映程序包名稱的子目錄 中,根據需要創建目錄。例如,對於 示例,如果指定-s C:\ mysrc並將該類稱爲 com.mypackage.MyClass,則源文件將放置在C:\ mysrc \ com \ mypackage \ MyClass.java中的 中。實施例的
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" } } }
此代碼段確實下:
使用gradle這個apt plugin代替。
只需在您的build.gradle文件project.buildDir屬性指定值:
project.buildDir = '/gen/main/java'
這將會把所有生成的文件建立到<project_root>/gen/main/java
文件夾。
這不是最好的解決方案,因爲不僅是生成的,而且編譯器的編譯輸出將被放置在該目錄(.class文件和其他您不想在源代碼中的東西)中。 –
感謝您的解決方案 - 它對我來說非常好,因爲我更喜歡將生成的文件放在'$ project.buildDir/generated/java'中,因爲這意味着您無需擔心更改如何幹淨的作品。另外,似乎沒有必要實際添加一個源集,無論如何工作。 –
如果其他人在後續重新編譯時遇到java編譯錯誤,請將以下內容添加到doFirst塊中: 'GFileUtils.cleanDirectory(directory); '..根據您的Gradle版本,您可能需要使用'FileUtils.cleanDirectory' – Darwayne
@PetterMåhlén,爲什麼sourceSet配置是可選的? gradle需要它來構建包含生成的類的jar。 – Sunnyday