【问题标题】:NoClassDefFoundError for JPA createEntityManagerFactoryJPA createEntityManagerFactory 的 NoClassDefFoundError
【发布时间】:2012-09-04 07:27:41
【问题描述】:

我是使用 EclipseLink JPA 开发的新手,我正在使用 eclipselink-2.4.0.v20120608-r11652.zip 这个版本。我的问题的全部故事是我的库包含一些 JPA 1.0 库,我决定通过下载上面的最新 EclipseLink 升级到 JPA 2.0,通过调整顺序以将这些最新库加载到第一个,我的代码可以使用最新的类从正确的库,

一旦我开始运行,createEntityManagerFactory 上的代码错误,抱怨它需要我刚刚摆脱的 datanucleus-api.jar 中的类。这是堆栈跟踪:

java.lang.NoClassDefFoundError: org/datanucleus/jpa/exceptions/NoPersistenceXmlException
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
at java.lang.Class.getConstructor0(Class.java:2699)
at java.lang.Class.newInstance0(Class.java:326)
at java.lang.Class.newInstance(Class.java:308)
at javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver.getPersistenceProviders(Unknown Source)
at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
at core.server.jpa.RawTrades.testMethod(RawTrades.java:18)
at test.testJPA.testMethod(testJPA.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:21)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:194)

我的代码是下面的标准代码

private static final String PERSISTENCE_UNIT_NAME = "SimTool";
  private static EntityManagerFactory factory;

public static void testMethod() {
    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME,new HashMap());
    EntityManager em = factory.createEntityManager();
}

我的 persistence.xml 站点位于 /WEB-INFO/classes/META-INFO/persistence.xml,有趣的是我将它设置为进行日志记录,但根本没有生成日志文件。

 <?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="SimTool" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>core.server.jpa.RawTrade</class>
<class>core.shared.Schedule</class>
<properties>
  <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
  <property name="javax.persistence.jdbc.url"
    value="jdbc:sqlserver://gprimesqldb1u.eur.nsroot.net:2431;databasename=GlobalPrimeDb" />
  <property name="javax.persistence.jdbc.user" value="NoSafeToShare" />
  <property name="javax.persistence.jdbc.password" value="OnlyDeterminedOneWillGetIt" />

  <!-- EclipseLink should create the database schema automatically -->
  <property name="eclipselink.ddl-generation" value="create-tables" />
  <property name="eclipselink.ddl-generation.output-mode" value="both" />
  <property name="eclipselink.logging.file" value="JPAoutput.log"/>
  <property name="eclipselink.logging.logger" value="JavaLogger"/>
  <property name="eclipselink.logging.level" value="FINE" />
</properties>

我觉得代码仍在尝试加载旧的 JPA 库而不是 EclipseLink 库,非常感谢您的帮助

【问题讨论】:

  • 尝试使用来自 EclipseLink 的 javax.persistence jar,而不是来自 DataNucleous 的那个。
  • 对不起,以上评论没有帮助。 Persistence 类尝试加载类路径上的所有提供者,然后询问每个提供者是否是持久性单元的提供者。可能有一个来自 DataNucleous 的 jar 包含 META-INF/services/javax.persistence.spi.PersistenceProvider 文件仍在类路径上,导致 DataNucleous 作为提供程序加载,即使缺少一些必需的类。
  • 嗨,克里斯,你上面的评论确实导致了答案,我一直将问题归结为 GWT 的 AppEngine,那些 datanucleus 库是 AppEngine 的一部分,默认捆绑到我的 GWT 应用程序中,必须在一个库中包含一些不需要的设置。我通过删除与 AppEngine 关联的所有 lib 来解决我的问题。

标签: java jpa persistence eclipselink persistence.xml


【解决方案1】:

datanucleus 添加到您的 WEB-INF 或运行时类路径中。

【讨论】:

  • 嗨,克里斯,这是一个简单的解决方案,但我首先摆脱这个库的原因是这个 datanucleus JPA 库是一个旧版本的 JPA,应该完全被 EclipseLink JPA i 取代刚刚安装。我很困惑为什么代码没有使用 org.eclipse.persistence.jpa PersistenceProvider 而是 datanucleus one
  • 此外,如果我将 datanucleus 库添加回来,代码是否会使用该库中的旧 JPA 关联,即使代码是针对新的 JPA 2.0 标准编译的(我的代码包含 CriteriaBuilder - 在 JPA2.2 中引入) 0)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 2013-10-24
相关资源
最近更新 更多