2015-03-26 2 views

ответ

10

Я искал и не нашел плагина для запуска DataNucleus Enhancer от Gradle. Но есть способ сделать это, используя задачу 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.

+0

С версией 3.1.1 DataNucleus Enhancer, имя класса для выполнения этой задачи энхансера теперь, кажется, ' 'org.datanucleus.enhancer.tools.EnhancerTask'' – Tad

+0

Как эта задача должна быть добавлена ​​к проекту & называется? – Tom

+1

@ Тэд, я отредактировал свой ответ. Благодаря! –

1

Вот несколько иной подход. Прежде всего, я создал класс EntityEnhancer в моем проекте. Этот класс вызывает DataNucleus enhancer посредством основного метода. Затем я назвал этот класс из задачи JavaExec от Gradle.

Это печатает все сообщения журнала энхансера на консоли 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() 
} 
+1

Почему бы просто не установить «персистентность», чтобы усилить, а не навязывать зависимость от Spring просто для того, чтобы получить классы? https://github.com/datanucleus/datanucleus-core/blob/master/src/main/java/org/datanucleus/enhancer/DataNucleusEnhancer.java#L453 –

+0

@NeilStockton Хорошая точка. К сожалению, для этого вам нужно иметь файл persistence.xml в вашем пути к классам (которого у меня нет), или вам нужно реализовать класс DataNucleus PersistenceUnitMetaData. Но если у вас есть, я сохраню еще несколько строк кода. –

+0

hmm, который можно легко положить в плагин Gradle :) – Stef

 Смежные вопросы

  • Нет связанных вопросов^_^