2016-05-29 33 views
6

項目包含註釋處理器,它在編譯期間生成Java代碼。默認情況下,gradle輸出生成源文件到build/classes目錄。這會導致IntelliJ發現新生成的源文件時出現一些問題。更改gradle中生成代碼的輸出目錄

是否有任何直接的方式配置gradle輸出源文件到另一個目錄?例如$buildDir/gen/main/java$buildDir/build/generated/main/java

回答

9

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代替。

+0

感謝您的解決方案 - 它對我來說非常好,因爲我更喜歡將生成的文件放在'$ project.buildDir/generated/java'中,因爲這意味着您無需擔心更改如何幹淨的作品。另外,似乎沒有必要實際添加一個源集,無論如何工作。 –

+0

如果其他人在後續重新編譯時遇到java編譯錯誤,請將以下內容添加到doFirst塊中: 'GFileUtils.cleanDirectory(directory); '..根據您的Gradle版本,您可能需要使用'FileUtils.cleanDirectory' – Darwayne

+0

@PetterMåhlén,爲什麼sourceSet配置是可選的? gradle需要它來構建包含生成的類的jar。 – Sunnyday

1

只需在您的build.gradle文件project.buildDir屬性指定值:

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

這將會把所有生成的文件建立到<project_root>/gen/main/java文件夾。

+0

這不是最好的解決方案,因爲不僅是生成的,而且編譯器的編譯輸出將被放置在該目錄(.class文件和其他您不想在源代碼中的東西)中。 –