Hibernate: "ClassNotFoundException: javax.persistence.spi.ProviderUtil" - PullRequest
2 голосов
/ 30 ноября 2009

Мое приложение пытается использовать аннотации Hibernate. Я установил версию Hibernate 3.5.0, но при попытке загрузить приложение получаю следующее исключение:

junit.framework.AssertionFailedError: Exception in constructor: testSubscriber (java.lang.NoClassDefFoundError: javax/persistence/spi/ProviderUtil
    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.Persistence.findAllProviders(Persistence.java:79)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
    at com.upod.dao.SubscriberDAOTest.<init>(SubscriberDAOTest.java:32)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at junit.framework.TestSuite.createTest(TestSuite.java:58)
    at junit.framework.TestSuite.addTestMethod(TestSuite.java:280)
    at junit.framework.TestSuite.<init>(TestSuite.java:140)
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestLoader.getTest(JUnit3TestLoader.java:102)
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestLoader.loadTests(JUnit3TestLoader.java:59)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:445)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.ClassNotFoundException: javax.persistence.spi.ProviderUtil
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:319)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:254)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:399)
    ... 22 more
)
    at junit.framework.Assert.fail(Assert.java:47)
    at junit.framework.TestSuite$1.runTest(TestSuite.java:90)
    at junit.framework.TestCase.runBare(TestCase.java:130)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:120)
    at junit.framework.TestSuite.runTest(TestSuite.java:230)
    at junit.framework.TestSuite.run(TestSuite.java:225)
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

Иногда я что-то упускаю или у меня несовместимые банки снова , но я не могу понять, в чем проблема. У меня есть hibernate3.jar, ejb3-persistence.jar и все зависимости, указанные в документации по Hibernate, но я все еще получаю это.

Ответы [ 3 ]

6 голосов
/ 22 февраля 2010

Если вы используете Hibernate 3.5.x, вам также понадобится следующий jar-файл.

hibernate-jpa-2.0-api-1.0.0-CR-1.jar

У меня была такая же проблема, и добавление исправило эту проблему.

2 голосов
/ 01 декабря 2009

Я не знаю, на какую документацию вы ссылаетесь, поскольку вы не разместили ни одной ссылки, поэтому я не проверял, что она говорит, но я думаю, что вы упускаете зависимость jpa-api, которую я вижу в pom.xml из hibernate-parent-3.5.0-Beta-2 (обеспечивает javax.persistence.spi.ProviderUtil):

<dependency>
  <groupId>org.hibernate.java-persistence</groupId>
  <artifactId>jpa-api</artifactId>
  <version>2.0-cr-1</version>
</dependency>

Вы можете получить его из репозитория JBoss Maven (он, похоже, не входит в комплект, выпущенный в SourceForge ). Время начать использовать maven:)

1 голос
/ 30 ноября 2009

У вас есть правильный JPA кувшин в вашем classpath? так как ваша ошибка: java.lang.NoClassDefFoundError: javax/persistence/spi/ProviderUtil

EDIT

Знаете, прежде чем мы продолжим пытаться выяснить это, мы должны спросить, действительно ли необходимо использовать 3.5.0 (поскольку на момент написания этой статьи это 3.5.0- Бета -2). Если вам нужны только аннотации, достаточно использовать Hibernate Core 3.3.2, чтобы позволить вам использовать аннотации Hibernate 3.4.0.

ИМХО, вы можете просто сделать резервную копию версии на что-нибудь "безопасное"

...