项目包含注释处理器,它在编译期间生成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