I was using this for a long time, but I found moving to Java 11 / Gradle 6 it didn't work any more. Java 11 does not have the JAXB API so it needs to be added as a dependency. Also the mechanism of calling XJC using Ant inside Gradle didn't want to work, possibly I just didn't find the magic combination of flags! Instead it is possible to call the XJC main class listed in the JAR manifest, cutting out Ant altogether. The configuration here is working for me using Gradle 6.3 and Java 11.
I haven't tried using this approach with a JAR + binding file, but the parameters are available according to the usage info so it should work!
UPDATE: Using the GlassFish implementation avoids issues with Sun internal dependencies, as per this question
sourceSets {
generated {
java.srcDir "$generated_dir"
}
}
dependencies {
compile sourceSets.generated.output
// Generated code depends on the JAXB API, which is removed from base Java in JDK 11
compile "org.glassfish.jaxb:jaxb-runtime:2.3.3"
generatedCompile "org.glassfish.jaxb:jaxb-runtime:2.3.3"
}
// XJC tasks
// JAXB configuration holds classpath for running the JAXB XJC compiler
configurations {
jaxb
}
dependencies {
jaxb "org.glassfish.jaxb:jaxb-xjc:2.3.3"
}
// Cookie cutter function for defining multiple XJC tasks
// (not necessary if you only have a single task)!
def addXjcTask(taskName, schema, pkg, dest) {
// If you haven't already, create the generated output dir before running XJC or it will fail
file(dest).mkdirs()
// The main XJC task, calls XJCFacade which is the entry point of the XJC JAR
tasks.create(name: taskName, type: JavaExec) {
classpath configurations.jaxb
main 'com.sun.tools.xjc.XJCFacade'
// To explore available args, download the XJC JAR and run java -jar jaxb-xjc.jar --help
args schema, "-p", pkg, "-d", dest
}
// Add a dependency on the new task so it gets invoked
compileGeneratedJava.dependsOn tasks.getByName(taskName)
}
// Add all the XJC tasks you need
addXjcTask("xjcSchema1",
"path/to/schema1.xsd",
'com.example.generated.schema1',
"$generated_dir")
addXjcTask("xjcSchema2",
"path/to/schema2.xsd",
'com.example.generated.schema2',
"$generated_dir")