如何从Gradle运行DataNucleus Enhancer?

时间:2015-03-26 13:18:46

标签: gradle datanucleus

是否有用于运行DataNucleus Enhancer的gradle插件?正如我从文档中看到的那样,您只能从Maven或Ant运行它:http://www.datanucleus.org/products/datanucleus/jpa/enhancer.html

2 个答案:

答案 0 :(得分:13)

我搜索并发现没有用于从Gradle运行DataNucleus Enhancer的插件。但是有一种方法可以通过使用DataNucleus Enhancer Ant任务来完成此任务。

我在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)

entityFiles中,您可以在其中配置JPA实体带注释的类。

不幸的是,您无法看到增强器输出,因为此任务正在使用Ant日志记录。除非您使用-i-d选项运行gradle。

使用:Java 8,org.eclipse.persistence:javax.persistence:2.1.0org.datanucleus:datanucleus-accessplatform-jpa-rdbms:4.1.1

答案 1 :(得分:1)

这是略有不同的方法。首先,我在项目中创建了EntityEnhancer类。该类通过其main方法调用DataNucleus增强器。然后我从Gradle的JavaExec任务中调用了这个类。

这将在Gradle控制台上打印出所有增强器的日志消息,也可以从IDE调用。

EntityEnhancer类使用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[]{});
    }
}

build.gradle文件的任务定义。这实际上将您刚刚编译的类放在类路径上并运行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()
}