2

Eclipse RCP アプリケーションで Xerces 2.11.0 を使用しようとしていますが、これまでに試したすべてのことから、方法がわかりません。さらに複雑なことに、Batik 1.7 も使用しようとしています。

Xerces と xml-apis 用の独自のバンドルを作成し、Batik が使用する追加の W3C DOM インターフェイスを xml-apis バンドルに追加しました。

Batik 内で発生する最初の問題

java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal

この根本的な理由は、org.w3c.dom が JRE に含まれており、org.eclipse.osgi (system.bundle) を通じて公開されているためと思われます。これは、パッケージを提供したい他のバンドルよりも優先されるようです。

バンドルで require-bundle を使用してシステムに影響を与えようとしたり、明示的なバージョンで import-package を使用したりすると、次のようなエラーが発生します

java.lang.LinkageError: loader constraint violation: loader
       (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) 
        previously initiated loading for a different type with name
        "org/w3c/dom/Document"

org.osgi.framework.system.packagesおよびorg.osgi.framework.bootdelegationパラメータを変更して org.w3c.dom を削除し、バンドルをosgi.framework.extensionsに追加すると、次のようなエラーが発生します

java.lang.LinkageError: loader constraint violation in interface itable
       initialization: when resolving method 
       "javax.xml.parsers.DocumentBuilder.setErrorHandler(
                 Lorg/xml/sax/ErrorHandler;)V" the class loader 
       (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader)
       of the current class, org/apache/log4j/xml/DOMConfigurator, and the 
       class loader (instance of <bootloader>) for resolved class, 
       javax/xml/parsers/DocumentBuilder, have different Class objects for the
       type rrorHandler;)V used in the signature

また、java.endorsed.dirs を使用してみましたが、これにより物事が非常に早く壊れます。

私が見逃した、または間違っている可能性のあるアイデアはありますか?

4

2 に答える 2

1

jdk 1.4 で DOM レベル 3 を使用すると同様の問題が発生しましたが、jdk で DOM API をオーバーライドする必要があるため、承認されたディレクトリが機能する唯一のソリューションだと思います。

このルートを再び下ることに直面することはできなかったので、代わりに ElementTraversal への参照を取り除き、手作業で Xerces をビルドすると、問題は解決しました。Batik が ElementTraversal を使用している場合、それはオプションではありません。

于 2012-10-10T09:52:49.900 に答える
0

私は解決策を見つけたと思います。

system.bundle によってホストされるフラグメントになるように、xml-apis バンドルを変更しました。

また、xml-apis バンドルを必要とするのではなく、パッケージをインポートするように Xerces バンドルを変更しました (これは元々、xerces に適切なパッケージを使用するよう説得するために行われました)。

私が行ったテストから、これは、すべての正しいクラスを含む org.w3c.dom パッケージの同じ実装を各バンドルが見つけるのに十分であるように見えます。

于 2012-10-10T14:21:22.977 に答える