我怎样才能 运行 来自 Gradle 的 DataNucleus Enhancer?
How can I run DataNucleus Enhancer from Gradle?
运行ning DataNucleus Enhancer 是否有 gradle 插件?正如我从文档中看到的那样,您只能 运行 它只能来自 Maven 或 Ant:http://www.datanucleus.org/products/datanucleus/jpa/enhancer.html
我搜索并没有找到 运行 来自 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 日志记录。除非你 运行 gradle 有 -i
或 -d
选项。
使用:Java8,org.eclipse.persistence:javax.persistence:2.1.0
,org.datanucleus:datanucleus-accessplatform-jpa-rdbms:4.1.1
。
这里的方法略有不同。首先,我在我的项目中创建了 EntityEnhancer
class。 class 通过其主要方法调用 DataNucleus 增强器。然后我从 Gradle 的 JavaExec 任务中调用了这个 class。
这会在 Gradle 控制台上打印出所有增强器的日志消息,也可以从 IDE 调用。
EntityEnhancer class 使用 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
文件的任务定义。这实际上将您刚刚编译的 classes 放在 class 路径上并运行 EntityEnhancer
class.
// 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()
}
运行ning DataNucleus Enhancer 是否有 gradle 插件?正如我从文档中看到的那样,您只能 运行 它只能来自 Maven 或 Ant:http://www.datanucleus.org/products/datanucleus/jpa/enhancer.html
我搜索并没有找到 运行 来自 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 日志记录。除非你 运行 gradle 有 -i
或 -d
选项。
使用:Java8,org.eclipse.persistence:javax.persistence:2.1.0
,org.datanucleus:datanucleus-accessplatform-jpa-rdbms:4.1.1
。
这里的方法略有不同。首先,我在我的项目中创建了 EntityEnhancer
class。 class 通过其主要方法调用 DataNucleus 增强器。然后我从 Gradle 的 JavaExec 任务中调用了这个 class。
这会在 Gradle 控制台上打印出所有增强器的日志消息,也可以从 IDE 调用。
EntityEnhancer class 使用 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
文件的任务定义。这实际上将您刚刚编译的 classes 放在 class 路径上并运行 EntityEnhancer
class.
// 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()
}