2016-05-29 428 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文件和其他您不想在源代码中的东西)中。 –