¿Cómo puedo ejecutar DataNucleus Enhancer desde Gradle?
(2)
¿Hay un complemento de Gradle para ejecutar DataNucleus Enhancer? Como puedo ver en la documentación, puedes ejecutarlo solo desde Maven o Ant: http://www.datanucleus.org/products/datanucleus/jpa/enhancer.html
Aquí hay un enfoque ligeramente diferente. Antes que nada, he creado la clase EntityEnhancer
en mi proyecto. Esta clase llama a DataNucleus enhancer a través de su método principal. Luego llamé a esta clase desde la tarea JavaExec de Gradle.
Imprime todos los mensajes de registro de Enhancer en la consola de Gradle y también se puede llamar desde IDE.
La clase EntityEnhancer usa la biblioteca Spring Boot 1.3.5.
public class EntityEnhancer {
private static final ClassPathScanningCandidateComponentProvider ENTITY_SCANNER;
static {
ENTITY_SCANNER = new ClassPathScanningCandidateComponentProvider(false);
ENTITY_SCANNER.addIncludeFilter(new AnnotationTypeFilter(Entity.class));
}
public static void main(String[] args) throws IOException {
Validate.isTrue(args.length == 1, "Expected single argument <package_to_scan>!");
String pathToScan = args[0];
String[] classesToEnhance = findEntityClasses(pathToScan);
Validate.isTrue(classesToEnhance.length > 0, "No classes to enhance has been found!");
DataNucleusEnhancer enhancer = new DataNucleusEnhancer("JPA", null);
enhancer.addClasses(classesToEnhance);
enhancer.enhance();
}
private static String[] findEntityClasses(String packageToScan) throws IOException {
Set<BeanDefinition> entityBeanDefinitions = ENTITY_SCANNER.findCandidateComponents(packageToScan);
List<String> entityClasses = entityBeanDefinitions.stream().map(BeanDefinition::getBeanClassName).collect(Collectors.toList());
return entityClasses.toArray(new String[]{});
}
}
Definición de tarea para su archivo build.gradle
. Esto coloca tus clases compiladas en el classpath y ejecuta la clase EntityEnhancer
.
// Call this task from your IDE after project compilation.
task enhanceJpaEntities(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
main = ''com.your.project.package.EntityEnhancer''
args ''com.your.entities.package''
}
classes.doLast {
enhanceJpaEntities.execute()
}
Busqué y no encontré ningún complemento para ejecutar DataNucleus Enhancer de Gradle. Pero hay una forma de hacerlo usando la tarea DataNucleus Enhancer Ant.
build.gradle
siguiente en mi build.gradle
.
task datanucleusEnhance {
description "Enhance JPA model classes using DataNucleus Enhancer"
dependsOn compileJava
doLast {
// define the entity classes
def entityFiles = fileTree(sourceSets.main.output.classesDir).matching {
include ''com/mycom/*.class'', ''org/myorg/*.class''
}
println "Enhancing with DataNucleus the following files"
entityFiles.getFiles().each {
println it
}
// define Ant task for DataNucleus Enhancer
ant.taskdef(
name : ''datanucleusenhancer'',
classpath : sourceSets.main.runtimeClasspath.asPath,
classname : ''org.datanucleus.enhancer.EnhancerTask''
// the below is for DataNucleus Enhancer 3.1.1
//classname : ''org.datanucleus.enhancer.tools.EnhancerTask''
)
// run the DataNucleus Enhancer as an Ant task
ant.datanucleusenhancer(
classpath: sourceSets.main.runtimeClasspath.asPath,
verbose: true,
api: "JPA") {
entityFiles.addToAntBuilder(ant, ''fileset'', FileCollection.AntType.FileSet)
}
}
}
classes.dependsOn(datanucleusEnhance)
En entityFiles
es donde configuras tu entidad JPA con clases anotadas.
Lamentablemente, no puede ver la salida del potenciador, ya que esta tarea utiliza el registro de Ant. A menos que esté ejecutando gradle con la opción -i
o -d
.