Есть ли плагин градиента для запуска DataNucleus Enhancer? Как я могу видеть из документации, вы можете запустить ее только с Maven или Ant: http://www.datanucleus.org/products/datanucleus/jpa/enhancer.htmlКак запустить DataNucleus Enhancer из Gradle?
ответ
Я искал и не нашел плагина для запуска 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
.
Вот несколько иной подход. Прежде всего, я создал класс 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()
}
Почему бы просто не установить «персистентность», чтобы усилить, а не навязывать зависимость от Spring просто для того, чтобы получить классы? https://github.com/datanucleus/datanucleus-core/blob/master/src/main/java/org/datanucleus/enhancer/DataNucleusEnhancer.java#L453 –
@NeilStockton Хорошая точка. К сожалению, для этого вам нужно иметь файл persistence.xml в вашем пути к классам (которого у меня нет), или вам нужно реализовать класс DataNucleus PersistenceUnitMetaData. Но если у вас есть, я сохраню еще несколько строк кода. –
hmm, который можно легко положить в плагин Gradle :) – Stef
С версией 3.1.1 DataNucleus Enhancer, имя класса для выполнения этой задачи энхансера теперь, кажется, ' 'org.datanucleus.enhancer.tools.EnhancerTask'' – Tad
Как эта задача должна быть добавлена к проекту & называется? – Tom
@ Тэд, я отредактировал свой ответ. Благодаря! –