2012-06-27 48 views
0
Error occurred during deployment: Exception while loading the app : 
java.lang.IllegalStateException: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: 
java.lang.IncompatibleClassChangeError: Implementing class. Please see server.log for more details. 

org.springframework.beans.factory.BeanCreationException: 
    Error creating bean with name 'helloWorldController': 
    Injection of autowired dependencies failed; nested exception is 
org.springframework.beans.factory.BeanCreationException: 
    Could not autowire field: private org.hibernate.SessionFactory 
    org.meluk.billboard.business.controller.HelloWorldController.sessionFactory; nested exception is 
org.springframework.beans.factory.BeanCreationException: 
    Error creating bean with name 'sessionFactory' defined in 
    ServletContext resource [/WEB-INF/billboard-servlet.xml]: 
    Invocation of init method failed; nested exception is 
    java.lang.IncompatibleClassChangeError: Implementing class 

我的pom.xml:IncompatibleClassChangeError而Spring上下文初始化

<properties> 
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <springVersion>3.1.0.RELEASE</springVersion> 
    <hibernateVersion>3.5.4-Final</hibernateVersion> 
    <junitVersion>4.8.2</junitVersion> 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${springVersion}</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

<dependencies> 
    <dependency> 
     <groupId>javax.sql</groupId> 
     <artifactId>jdbc-stdext</artifactId> 
     <version>2.0</version> 
    </dependency> 

    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-web-api</artifactId> 
     <version>6.0</version> 
     <scope>provided</scope> 
    </dependency> 

    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>${junitVersion}</version> 
     <scope>test</scope> 
    </dependency> 

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


    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>${springVersion}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-hibernate3</artifactId> 
     <version>2.0.8</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${springVersion}</version> 
    </dependency> 

我的Spring配置文件:

<context:component-scan base-package="org.meluk.billboard.business.controller" /> 
<tx:annotation-driven transaction-manager="txManager" /> 
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>/WEB-INF/config/jdbc.properties</value> 
     </list> 
    </property> 
</bean> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" > 
    <property name="driverClassName" value="${hibernate.connection.driver_class}" /> 
    <property name="url" value="${hibernate.connection.url}" /> 
    <property name="username" value="${hibernate.connection.username}" /> 
    <property name="password" value="${hibernate.connection.password}" /> 
</bean> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="configLocation" value="/WEB-INF/hibernate.cfg.xml" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.default_schema">${hibernate.default_schema}</prop> 
      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
      <prop key="hibernate.c3p0.min_size">${hibernate.c3p0.min_size}</prop> 
      <prop key="hibernate.c3p0.max_size">${hibernate.c3p0.max_size}</prop> 
      <prop key="hibernate.c3p0.timeout">${hibernate.c3p0.timeout}</prop> 
      <prop key="hibernate.c3p0.max_statements">${hibernate.c3p0.max_statements}</prop> 
     </props> 
    </property> 
</bean> 


<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

请帮助解决这个问题。

回答

2

明确设置弹簧Hibernate3的依赖性:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-hibernate3</artifactId> 
<version>2.0.8</version> 

这不是巧合,这是你得到的例外豆。

你不应该这样做;你有没有使用Spring的同一版本的spring-orm的原因?我有一段时间没有设置明确的hibernate3依赖关系。

+0

2.0.8是最新的可用版本.http://mvnrepository.com/artifact/org.springframework/spring-hibernate3 – Balconsky

+0

@Balconsky是什么让你觉得你需要它? –

2

IncompatibleClassChangeError意味着JVM获得有关某个类的相互矛盾的信息。当您针对一个类或接口的某个版本编译某些代码时,通常会发生这种情况,但在运行时使用该类/接口的不同版本。当JVM检查类和方法签名匹配时,运行时就会遇到问题。

在这种情况下,“实现类”消息似乎是说改变的类不再实现它原来的一些接口。 (也许程序包名称已更改)

在日志文件的某处应该有一个消息,指出导致问题的类,但是您提供的堆栈跟踪的expurgated版本没有。


我会说他们是两种可能性。一个是,你在构建你的构建方式时遇到了问题,并且你没有重新编译应该重新编译的东西。另一种可能性是你的WAR文件中有不一致的JAR混合;例如你在某种程度上混合了不同版本的Spring的JAR。

+0

如果我在WAR文件中有不一致的jar混合,我该如何识别它?哪个罐子可能不一致? – Balconsky

+0

如果你能弄清楚哪些类是冲突的,那将是一个开始。 –

相关问题