我有一个基于Spring的项目,因此以编程方式设置了实体管理器,不需要persistence.xml文件列出所有实体。
我目前正在使用加载时间编织,但是正在尝试使用Eclipselink和Gradle进行静态编织。我想复制由Maven eclipselink插件执行的操作:
https://github.com/ethlo/eclipselink-maven-plugin
我设置了以下gradle(请注意,这不是Kotlin DSL的常规做法):
task<JavaExec>("performJPAWeaving") {
val compileJava: JavaCompile = tasks.getByName("compileJava") as JavaCompile
dependsOn(compileJava)
val destinationDir = compileJava.destinationDir
println("Statically weaving classes in $destinationDir")
inputs.dir(destinationDir)
outputs.dir(destinationDir)
main = "org.eclipse.persistence.tools.weaving.jpa.StaticWeave"
args = listOf("-persistenceinfo", "src/main/resources", destinationDir.getAbsolutePath(), destinationDir.getAbsolutePath())
classpath = configurations.getByName("compile")
}
当我尝试运行任务时,编织任务由于寻找不存在的persistence.xml而失败。
有什么方法可以在基于Spring的JPA项目中静态编织JPA实体?
Exception Description: An exception was thrown while processing persistence.xml from URL: file:/home/blabla/trunk/my-module/src/main/resources/
Internal Exception: java.net.MalformedURLException
at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionProcessingPersistenceXML(PersistenceUnitLoadingException.java:117)
at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceXML(PersistenceUnitProcessor.java:579)
at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceArchive(PersistenceUnitProcessor.java:536)
... 6 more
Caused by: java.net.MalformedURLException
at java.net.URL.<init>(URL.java:627)
at java.net.URL.<init>(URL.java:490)
at java.net.URL.<init>(URL.java:439)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:620)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:148)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:806)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceXML(PersistenceUnitProcessor.java:577)
... 7 more
Caused by: java.lang.NullPointerException
at java.net.URL.<init>(URL.java:532)
... 17 more
最佳答案
我阅读了以下内容的现有documentation:org.eclipse.persistence.tools.weaving.jpa.StaticWeave
用法:
StaticWeave [选项]源目标
选项:
-classpath
设置用户类路径,使用“;”作为Windows系统中的定界符,并且
在Unix系统中为“:”。
-日志
日志文件的路径,标准输出为默认值。
-loglevel
为eclipselink日志级别指定一个文字值(OFF,SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINEST)。默认值
值是OFF。
-persistenceinfo
该路径包含META-INF / persistence.xml。仅当源不包含它时才需要。类路径必须包含所有
进行编织所需的类。
看完用法说明后,在我看来,该类需要persistence.xml
才能生成静态编织源。
我还测试了eclipselink maven插件,它按照您的指示在没有persistence.xml
的情况下也可以工作,因为它生成了persistence.xml
如果使用StaticWeave.class
不在CLASSPATH
中,则在调用之前使用它。
private void processPersistenceXml(ClassLoader classLoader, Set<String> entityClasses)
{
final File targetFile = new File(this.persistenceInfoLocation + "/META-INF/persistence.xml");
getLog().info("persistence.xml location: " + targetFile);
final String name = project.getArtifactId();
final Document doc = targetFile.exists() ? PersistenceXmlHelper.parseXml(targetFile) : PersistenceXmlHelper.createXml(name);
checkExisting(targetFile, classLoader, doc, entityClasses);
PersistenceXmlHelper.appendClasses(doc, entityClasses);
PersistenceXmlHelper.outputXml(doc, targetFile);
}
完整的源代码是here
我认为您可以在构建Gradle中遵循相同的方法。
关于spring - 当没有persistence.xml时,如何使用EclipseLink静态编织JPA实体,因为这些实体由Spring管理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55161549/