【问题标题】:Change output directory of generated code in gradle在 gradle 中更改生成代码的输出目录
【发布时间】:2020-05-06 20:38:49
【问题描述】:

项目包含注释处理器,它在编译期间生成 java 代码。默认情况下,gradle 将生成的源文件输出到build/classes 目录。这会导致 IntelliJ 发现新生成的源文件时出现一些问题。

是否有任何直接的方法可以配置 gradle 以将源文件输出到另一个目录?例如$buildDir/gen/main/java$buildDir/build/generated/main/java?

【问题讨论】:

    标签: java gradle code-generation


    【解决方案1】:

    java 编译器有一个选项允许为生成的 java 源自定义输出目录 (documentation)。

    -s 目录

    指定放置生成的源文件的目录。这 目录必须已经存在; 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"
            }
        }
    }
    

    此代码 sn-p 接下来执行:

    • 创建并指定目录作为生成代码的输出
    • 如果调用 clean 任务,则删除生成的源
    • 添加新的源集

    更新

    请改用 gradle apt plugin

    【讨论】:

    • 感谢您的解决方案 - 它对我来说非常有用,但我更喜欢将生成的文件放在 $project.buildDir/generated/java 中,因为这意味着您无需担心更改清洁度作品。此外,似乎不需要实际添加源集,无论如何都可以。
    • 如果其他人在后续重新编译时遇到 java 编译错误 .. 将以下内容添加到 doFirst 块:GFileUtils.cleanDirectory(directory); .. 根据您的 gradle 版本,您可能需要使用 FileUtils.cleanDirectory
    • @PetterMåhlén,为什么 sourceSet 配置是可选的? gradle 需要它来构建包含生成的类的 jar。
    • @Sunnyday 我不知道,Gradle 对我来说很大程度上是个谜。只是报告我的经历。 :)
    【解决方案2】:

    只需在 build.gradle 文件中为 project.buildDir 属性指定值:

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

    这会将所有生成的构建文件放到&lt;project_root&gt;/gen/main/java 文件夹中。

    【讨论】:

    • 这不是最好的解决方案,因为不仅生成,而且编译器的构建输出都将放在该目录中(.class 文件和其他您不想在源代码中的东西代码)。
    【解决方案3】:

    默认生成的 Java 文件位于$generatedFilesBaseDir/$sourceSet/$builtinPluginName 下,其中$generatedFilesBaseDir 默认为$buildDir/generated/source/proto,并且是可配置的。例如,

    protobuf {
     ...
      generatedFilesBaseDir = "$projectDir/src/generated"
    }
    

    子目录名称,默认为$builtinPluginName,也可以通过在generateProtoTasks 块内的任务配置的builtins 或plugins 块中设置outputSubDir 属性来更改(参见上一节)。例如,

    {
      task ->
      task.plugins {
        grpc {
        // Write the generated files under
        // "$generatedFilesBaseDir/$sourceSet/grpcjava"
        outputSubDir = 'grpcjava'
        }
      }
    }
    

    github protobuf-gradle-plugin

    【讨论】:

      猜你喜欢
      • 2015-01-25
      • 2015-11-01
      • 2010-12-08
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 2013-04-21
      • 2017-01-30
      相关资源
      最近更新 更多