【问题标题】:How can I run DataNucleus Enhancer from Gradle?如何从 Gradle 运行 DataNucleus Enhancer?
【发布时间】:2015-05-30 12:44:33
【问题描述】:

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

【问题讨论】:

    标签: gradle datanucleus


    【解决方案1】:

    我搜索并发现没有从 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

    【讨论】:

    • 使用 3.1.1 版的 DataNucleus Enhancer,增强器任务的类名现在似乎是 'org.datanucleus.enhancer.tools.EnhancerTask'
    • 这个任务应该如何添加到项目中并调用?
    • @Tom,这是一个 Gradle 任务,只需将其添加到您的 build.gradle 中即可。如果您使用的是 Eclipse 之类的 IDE,您应该使用 Gradle 集成。
    • @AdrianBer 最后我想通了;值得指出的是,如果您的 build.gradle 需要,脚本必须高于 war.dependsOn datanucleusEnhance
    • 我不再从事那个项目了,但当时我使用的是 Java 8 和 org.eclipse.persistence:javax.persistence:2.1.0, org.datanucleus:datanucleus-accessplatform-jpa -rdbms:4.1.1。我希望这有帮助。我也会在我的回答中说明这一点。
    【解决方案2】:

    这里的方法略有不同。首先,我在我的项目中创建了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()
    }
    

    【讨论】:

    • 为什么不只是设置“持久性单元”来增强而不是仅仅为了获取类而对 Spring 施加依赖? github.com/datanucleus/datanucleus-core/blob/master/src/main/…
    • @NeilStockton 好点。不幸的是,要做到这一点,你需要在你的类路径上有 persistence.xml 文件(我没有),或者你必须实现 DataNucleus PersistenceUnitMetaData 类。但如果你有我会保存更多的代码行。
    • 嗯,可以很容易地放入 Gradle 插件中 :)
    • @Stef 没错!作为演示应用程序的一部分,我已经完成了这项工作。我的意图不是创建一个额外的插件或在 Groovy 中做任何事情。只是为了让它尽可能简单(尽可能少的代码)。演示应用源码在这里:github.com/vkuzel/Orm-Frameworks-Demo/tree/master/datanucleus
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多