4

さまざまなサイトで、この問題に触れていると思われるスレッドをいくつか見つけましたが、うまくいきません。それは単にできないようです。Caused by: java.lang.IncompatibleClassChangeError: Found interface org.hibernate.cfg.Mappings, but class was expectedエラーが発生し ます。このスレッドに示されている互換性マトリックスを見てください。ダウングレードしないとリベンジは使えないようです。しかし、これは正しくないように思えます。

アップグレードを開始すると、すべてが機能しましたが、今では同じエラーが発生しています。クラスパスに同じ名前の 2 つの異なる jar がないようにしました。私は次の瓶を持っています:

commons-logging-1.0.4.jar
dom4j-1.6.1.jar
hibernate3.jar
hibernate-tools.jar    
slf4j-api-1.6.6.jar
slf4j-log4j12-1.6.6.jar
sqljdbc4.jar
other various jars not dealing with hibernate..

完全なスタック トレースは次のとおりです。

    ...   
    hibernatetool
    Executing Hibernate Tool with a JDBC Configuration (for reverse engineering)
    1. task: hbm2hbmxml (Generates a set of hbm.xml files)     java.lang.IncompatibleClassChangeError: Found interface org.hibernate.cfg.Mappings, but class was expected
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:116)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:390)
    at org.apache.tools.ant.Target.performTasks(Target.java:411)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
    at org.apache.tools.ant.Main.runBuild(Main.java:809)
    at org.apache.tools.ant.Main.startAnt(Main.java:217)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.ant.execution.AntMain2.main(AntMain2.java:29)
Caused by: java.lang.IncompatibleClassChangeError: Found interface org.hibernate.cfg.Mappings, but class was expected
    at org.hibernate.cfg.reveng.MappingsDatabaseCollector.getTable(MappingsDatabaseCollector.java:25)
    at org.hibernate.cfg.reveng.JDBCReader.processTables(JDBCReader.java:535)
    at org.hibernate.cfg.reveng.JDBCReader.readDatabaseSchema(JDBCReader.java:74)
    at org.hibernate.cfg.reveng.JDBCReader.readDatabaseSchema(JDBCReader.java:860)
    at org.hibernate.cfg.JDBCBinder.readDatabaseSchema(JDBCBinder.java:121)
    at org.hibernate.cfg.JDBCBinder.readFromDatabase(JDBCBinder.java:94)
    ... 

蟻:

<taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="classpath" />
...
 <hibernatetool>
    <jdbcconfiguration configurationfile="${conf.dir}/${dbName}_hibernate-template.cfg.xml" packagename="myPackageName" revengfile="${conf.dir}/hibernate.reveng.xml" reversestrategy="com.capitaliq.loader.dev.codegen.HibernateReverseStrategy" detectmanytomany="false" />
    <hbm2hbmxml destdir="${srcGen.dir}" />
    <!-- Generate new hibernate.cfg.xml including new POJOs-->
    <!--'destdir' is relative to 'packagename' configuration-->
    <hbm2cfgxml ejb3="false" destdir="${conf.dir}" />
</hibernatetool>

<!-- Generate java POJOs from mapping files-->
<hibernatetool> <!--Line 384-->
    <configuration configurationfile="${conf.dir}/${dbName}_hibernate-template.cfg.xml">
        <fileset dir="${orm.pkg.dir}">
            <include name="**/*.hbm.xml" />
        </fileset>
    </configuration>
    <!--'destdir' is relative to 'packagename' configuration-->
    <hbm2java jdk5="true" ejb3="false" destdir="${srcGen.dir}" />
</hibernatetool>

どんな助けでも素晴らしいでしょう。このコンピューターは投げ出されようとしています。みんなありがとう。

4

2 に答える 2

3

このリンクによると。休止状態への貢献者の 1 人であるMaxは、次のように述べています (スレッドの下部近く)。

「問題は、Hibernate 3.6 のクラスがクラスからインターフェースへと変更されたことです。つまり、Hibernate ツールとはソース互換性がありますが、バイナリ互換性はありません。

これに加えて他のバイナリ変更がこの問題を引き起こし、https://issues.jboss.org/browse/JBIDE-8071に記録されています

したがって、「回避策」は、休止状態ツールでコードを生成する必要がある場合で、クラスパスに休止状態 3.6 を含めないでください。結果のコードは、その後 3.6 で問題なく使用できます。

課題は、3.6 のサポートを追加すると、3.3 から 3.5 のサポートも失われることです。したがって、今のところ更新は行っていませんが、今後何ができるかを見ていきます。」

私は不可能なことをしようとしていたようです。ようやく答えが出てよかったのですが、残念ながら、それは私が望んでいたものではありませんでした.

2 つの jar が互いに依存していても、2 つの jar を同じクラスパスに置くことはできません。ハイバネート コードをリバース エンジニアリングする場合は、ハイバネート バージョン 3.6 を使用しないことをお勧めします。

于 2012-07-31T17:32:59.243 に答える
1

jar が同じ名前を持っていないという事実は、それらがまったく同じクラスを含むことができないという意味ではありません。

通常、Hibernate と SLF4J では 1 つの jar のみを使用する必要があります。他の jar には、通常、大きなメイン jar のクラスの一部と、特定のタスク用のいくつかの追加クラスが含まれています。

私は削除することから始めhibernate-tools.jarslf4j-api-1.6.6.jarそしておそらくさらに、特定の必要なjarを追加できるcommons-logging-1.0.4.jarかどうかを確認します。ClassNotFoundException

于 2012-07-30T15:23:34.470 に答える