gradle datanucleus

¿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 .