Exec Java code to generate another Java source file (and then compile the generated code for a WAR file)

Okay, here’s my solution. I created a new Gradle script file called ‘build-rmt-svc-handler.gradle’ which is included into each one of our custom WAR projects…

/*
 * Gradle build script fragment for generating and compiling the
 * GenericRemoteServicesHandlerImpl.class
 */
configurations {
	rmtSvcHandlerBuilder
}

dependencies {
	rmtSvcHandlerBuilder "junit:junit:$ver_junit"
	rmtSvcHandlerBuilder "org.reflections:reflections:$ver_reflections"
	rmtSvcHandlerBuilder "org.slf4j:slf4j-api:$ver_slf4j"
}

task generateRmtSvcHandlerImpl(type: JavaExec) {
	dependsOn jar
	classpath = files(
			configurations.rmtSvcHandlerBuilder,
			fileTree(dir: "$rootProject.projectDir/gwt", include: '*.jar'),
			fileTree(dir: "$rootProject.projectDir/AcmeGwt/build/libs",  include: '*.jar'),
			fileTree(dir: "$rootProject.projectDir/AcmeCore/build/libs", include: '*.jar'),
			fileTree(dir: "/${buildDir}/libs", include: '*.jar'))
	
	main = 'com.acme.server.service.GenericRemoteServicesJsonHandlerBuilder'
	args "/${buildDir}/generated-sources/GenericRemoteServicesHandlerImpl.java"
	args 'false'
	
	doFirst {
		(new File("/${buildDir}/generated-sources")).mkdirs()
	}
}

task compileRmtSvcHandlerImpl(type: JavaCompile) {
	dependsOn generateRmtSvcHandlerImpl
	classpath = files(
			fileTree(dir: "$rootProject.projectDir/AcmeGwt/build/libs", include: '*.jar'),
			fileTree(dir: "$rootProject.projectDir/AcmeCore/build/libs",  include: '*.jar'),
			fileTree(dir: "/${buildDir}/libs", include: '*.jar'))
	
	source = fileTree(dir: "/${buildDir}/generated-sources", include: '**/*.java')
	destinationDir = file("/${buildDir}/classes/java/main")
}

war {
	dependsOn compileRmtSvcHandlerImpl
}

I wish it didn’t feel so hacky, and I’m still open to other suggestions if anyone has any.

Thanks and best regards,
Lee