Change output directory of generated code in gradle

There is an option for java compiler which allows to customize output directory for generated java sources (documentation).

-s dir

Specify the directory where to place generated source files. The directory must already exist; javac will not create it. If a class is part of a package, the compiler puts the source file in a subdirectory reflecting the package name, creating directories as needed. For example, if you specify -s C:\mysrc and the class is called com.mypackage.MyClass, then the source file will be placed in C:\mysrc\com\mypackage\MyClass.java.

Example of 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"
        }
    }
}

This code snippet does next:

  • creates and specifies directory as output for generated code
  • deletes generated sources if clean task is invoked
  • adds new source set

Update

Use gradle apt plugin instead.


By default generated Java files are under $generatedFilesBaseDir/$sourceSet/$builtinPluginName, where $generatedFilesBaseDir is $buildDir/generated/source/proto by default, and is configurable. E.g.,

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

The subdirectory name, which is by default $builtinPluginName, can also be changed by setting the outputSubDir property in the builtins or plugins block of a task configuration within generateProtoTasks block (see previous section). E.g.,

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

to see github protobuf-gradle-plugin


Simply specify value for project.buildDir property in your build.gradle file:

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

This will put all generated build files to the <project_root>/gen/main/java folder.