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:

<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>

私の春の設定ファイル:

<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>

この問題の解決にご協力ください。

4

2 に答える 2

2

AnIncompatibleClassChangeErrorは、JVM が何らかのクラスに関する矛盾した情報を取得していることを意味します。これは通常、あるバージョンのクラスまたはインターフェースに対してコードをコンパイルした後、実行時にそのクラスまたはインターフェースの別のバージョンを使用する場合に発生します。この問題は、クラスとメソッドのシグネチャが一致することを JVM が確認する実行時に検出されます。

この場合、「クラスを実装しています」というメッセージは、変更されたクラスが、元のインターフェイスを実装していないことを示しているようです。(パッケージ名が変更されている可能性があります。)

ログ ファイルのどこかに、問題の原因となっているクラスの名前を示すメッセージがあるはずですが、提供されたスタック トレースの削除されたバージョンにはありません。


私はそれらが2つの可能性だと思います。1 つは、ビルドの実行方法に問題があり、再コンパイルする必要があるものを再コンパイルしていないことです。もう 1 つの可能性は、WAR ファイル内の JAR の混合が一貫していないことです。たとえば、Spring の異なるバージョンの JAR を何らかの形で混在させています。

于 2012-06-27T11:06:45.153 に答える
2

spring-hibernate3 依存関係を明示的に設定します。

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

これが例外を受け取っている Bean であることは偶然ではありません。

その必要はありません。使用している同じバージョンの Spring の spring-orm を使用していない理由はありますか? かなり長い間、明示的な hibernate3 依存関係を設定していません。

于 2012-06-27T11:19:43.853 に答える