2015-06-05 1 views
2

я встретил NoClassDefFoundError при инициировании HibernateJPAVendorAdapterNoClassDefFoundError: орг/спящий режим/EJB/HibernatePersistence

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaVendorAdapter' defined in class path resource [META-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/hibernate/ejb/HibernatePersistence 

Я проверил несколько потоков на это исключение, но не удалось выяснить причину этого. Я думаю, что инициализация JPAVendorAdapter провалилась, но не знаю, почему. Может быть, несовместимости между моими зависимостями пакета или в моем applicationContext.xml. Вот они; pom.xml (только связанные разделы включены)

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.canreef</groupId> 
    <artifactId>Calendar</artifactId> 
    <version>1.0</version> 
    <packaging>war</packaging> 

    <name>Calendar</name> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <maven.compiler.source>1.7</maven.compiler.source> 
     <maven.compiler.target>1.7</maven.compiler.target> 
     <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 

     <org.springframework.version>4.0.1.RELEASE</org.springframework.version> 
     <org.springframework.data.version>1.7.0.RELEASE</org.springframework.data.version> 
     <org.springframework.instrument.version>4.1.1.RELEASE</org.springframework.instrument.version> 
     <org.hibernate.version>4.1.7.Final</org.hibernate.version> 
     <jackson.version>2.4.4</jackson.version> 
     <external.resources>${project.basedir}/src/main/lib</external.resources> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>4.3.1.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>4.3.0.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-web-api</artifactId> 
      <version>7.0</version> 
      <scope>provided</scope> 
     </dependency>   
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency>   
     <!-- Added--> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-jpa</artifactId> 
      <version>${org.springframework.data.version}</version> 

     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-instrument</artifactId> 
      <version>${org.springframework.instrument.version}</version> 
      <scope>provided</scope> 
     </dependency>   
     <dependency> 
      <groupId>org.apache.derby</groupId> 
      <artifactId>derbyclient</artifactId> 
      <version>10.11.1.1</version> 
     </dependency> 

    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
        <compilerArguments> 
         <endorseddirs>${endorsed.dir}</endorseddirs> 
        </compilerArguments> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.3</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.6</version> 
       <executions> 
        <execution> 
         <phase>validate</phase> 
         <goals> 
          <goal>copy</goal> 
         </goals> 
         <configuration> 
          <outputDirectory>${external.resources}</outputDirectory> 
          <silent>true</silent> 
          <artifactItems> 
           <artifactItem> 
            <groupId>javax</groupId> 
            <artifactId>javaee-endorsed-api</artifactId> 
            <version>7.0</version> 
            <type>jar</type> 
           </artifactItem> 
          </artifactItems> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
    <repositories> 
     <repository> 
      <id>unknown-jars-temp-repo</id> 
      <name>A temporary repository created by NetBeans for libraries and jars it could not identify. Please replace the dependencies in this repository with correct ones and delete this repository.</name> 
      <url>file:${project.basedir}/lib</url> 
     </repository> 
    </repositories> 
</project> 

applicationContext.xml

<?xml version='1.0' encoding='UTF-8' ?> 
<!-- was: <?xml version="1.0" encoding="UTF-8"?> --> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
     xmlns:context="http://www.springframework.org/schema/context" 

     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
     http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository.xsd"> 

    <jpa:repositories base-package="com.canreef.calendar"/> 
    <context:component-scan base-package="com.canreef.calendar"/> 
    <!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) --> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver"/> 
     <property name="url" value="jdbc:derby://localhost:1527/GEAH"/> 
     <property name="username" value="xxx"/> 
     <property name="password" value="xxx"/> 
    </bean> 

    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="showSql" value="true" /> 
     <property name="generateDdl" value="true" /> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="persistenceUnitName" value="Test_PU"/> 
     <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/> 
     <property name="packagesToScan" value="com.canreef.calendar"/> 

    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 
</beans> 

Действительно признательна, если кто-нибудь может указать на то, что это неправильно в моем коде.

+0

Почему вы используете hibernate-core AND hibernate-entitymanager? Вы должны решить одну из двух. Я также рекомендую вам проверить, есть ли у вас зависимость для 'org.hibernate.javax.persistence' (желательно для JPA 2.1, которая не поставляется с spring-data-jpa. – Schaka

+0

@Schaka Я попытался удалить спящий ядро, но он не сделал Не работайте, добавив hibernate.javax.persistence api 2.1. Также обратите внимание, что у меня уже есть hibernate.javax.persistence api 2.1. в pom – OrlandoL

ответ

2

Пожалуйста, убедитесь, что ваш скомпилированный файл войны содержит только ОДИН org.hibernate.javax.persistence jar, он должен быть 2.1. Spring-data-jpa перетаскивает hibernate-jpa 2.0 вместе с ним, вы должны исключить это специально в свой pom.xml.

Кроме того, вам действительно нужно удалить hibernate-core и ТОЛЬКО иметь hibernate-entitymanager на вашем пути к классу. Удостоверьтесь, что ничто другое не тянет вдоль гибернатного ядра. Класс, который вы ищете, содержится только в hibernate-entitymanager.

Эти 2 вещи ОПРЕДЕЛЕННО ваш преступник. Скомпилируйте и проверьте правильные JAR. Если вы запускаете Tomcat из Eclipse, убедитесь, что у вашего Deployment Assembly есть все правильные файлы классов. Выполнение mvn eclipse:eclipse также может помочь.

В принципе, перед запуском сервера убедитесь, что все банки/классы находятся именно там, где они должны быть. Выполнение, как я сказал, должно исправить это уже, но если это не так, это должно обязательно помочь личности виновника.

+0

Спасибо, Шака за резкий ответ.Преступник был расстрелян в голову, и несовместимость, похоже, исчезла! – OrlandoL

+1

Чтобы узнать больше о включенных зависимостях ваших зависимостей, попробуйте «" зависимость mvn: tree "" Это помогло мне понять, почему у меня есть двойные банки с разными версиями. – Conffusion

1

Тот же вопрос, что и NoClassDefFoundError with Spring maven hibernate org/hibernate/ejb/HibernatePersistence? Вы пропускаете зависимость:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>${hibernate.version}</version> 
</dependency> 

Если у вас есть NoClassDefFound исключение является хорошей отправной точкой, чтобы смотреть, если отсутствует класс находится в одном из ваших баночек зависимостей. Если нет, добавьте отсутствующую зависимость.

ПЛАН ПРАВИЛЬНОЙ ПРАЗДНИКИ относится к hibernate-entitymanager 4.2.8.Final (см. http://central.maven.org/maven2/org/springframework/spring-orm/4.0.1.RELEASE/spring-orm-4.0.1.RELEASE.pom). Вы зависеть от 4.1. *.

+0

Нет, это первая зависимость от POM. Это не проблема. – dunni

+0

Вы правы. Извините. Есть ли какая-то конкретная причина, по которой вы используете 2 версии для зависимостей в спящем режиме (4.3.0 и 4.3.1)? В программе POM весны-рамки-orm относится к hibernate-entitymanager 4.2.8. http://central.maven.org/maven2/org/springframework/spring-orm/4.0.1.RELEASE/spring-orm-4.0.1.RELEASE.pom – Conffusion

+0

Спасибо, что вы сделали очень хороший момент. публичный репозиторий в компании имеет некоторые версии, отсутствующие для банок, и именно поэтому я использовал 4. 3.0 и 4.3.1. Мне удалось изменить версию 4.3.0 на 4.2.8, но исключение сохраняется. – OrlandoL