11

私はこの対立に最初に遭遇したのではないと確信しています。

私が継承したコードは次のことを行います。

org.w3c.dom.Document dom; // declaration
javax.xml.validation.Schema schema; // declaration

...
...
...

javax.xml.validation.Validator validator = schema.newValidator();
validator.validate(new DOMSource(dom));

ここで、...は一見重要でない/無関係なコードを表します

JDK 6を使用したコードのコンパイルと実行は機能します(そして常に...)

最近、社内の他の場所で作成された別のコンポーネントをコードに統合する必要がありました。そのコンポーネントは、クラスパスに含める必要があります。xercesImpl-2.8.1.jar

このサードパーティのコンポーネントは絶対に必要です、上記のコードを実行すると機能しなくなり、次のようになります。

org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'Root'.
 at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
 at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
 at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
 at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
 at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
 at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
 at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
 at org.apache.xerces.jaxp.validation.DOMValidatorHelper.beginNode(Unknown Source)
 at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
 at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
 at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
 at javax.xml.validation.Validator.validate(Validator.java:127)

解決策として、私はおそらくxercesImpl-2.8.1.jarを独自のクラスローダーでシールドすることを考えましたが、おそらくクラスローダーの知識が不足しているため、またはそれが進むべき道ではないために、それを行うことができませんでした。私の環境についてもう1つ、私のアプリはTomcat5.5および6で実行されます...

ちなみに、デバッグ中に実行すると気づきましたdom.getImplementation()

  • xercesImpl-2.8.1.jarクラスパス にを追加する と、結果は次のようになります。org.apache.xerces.dom.DeferredDOMImplementationImpl@5f15c
  • それを削除すると、結果は次のようになりますcom.sun.org.apache.xerces.internal.dom.DeferredDOMImplementationImpl@6c6ae3

[私が思うに注意深い読者には驚くことではありません]

助言がありますか?

4

4 に答える 4

7

使用する代わりに:

// Uses first classloader-available implementation found:
//import javax.xml.validation.SchemaFactory;
SchemaFactory schemaFactory= SchemaFactory.newInstance(
    XMLConstants.W3C_XML_SCHEMA_NS_URI);

(Java 1.6以降)を使用してみてください。

// Uses org.apache.xerces.jaxp.validation.XMLSchemaFactory subclass 
//of SchemaFactory as implementation:
//import javax.xml.validation.SchemaFactory;
SchemaFactory schemaFactory= SchemaFactory.newInstance(
    XMLConstants.W3C_XML_SCHEMA_NS_URI,
    "org.apache.xerces.jaxp.validation.XMLSchemaFactory",
    null);

関連するJavaDocを参照してください。

または、META-INF /サービスエンジニアリングを使用します:例を含む記事

それがまだ誰かを助けることを願っています。

ガブリエル

于 2011-08-26T18:21:59.770 に答える
6

http://xml.apache.org/xalan-j/faq.html#faq-N100EFによる

新しいバージョンのXalan-Javaを使用し、JDKにパッケージされているバージョンをオーバーライドするには、次のようにします。

承認された標準のオーバーライドメカニズムを使用します。xalan.jar、serializer.jar、xercesImpl.jar、およびxml-apis.jarを、ランタイムソフトウェアがインストールされているJREの\ lib\endorsedディレクトリに配置します。

于 2010-06-24T17:57:52.883 に答える
2

最初に試すことは、xercesjarを承認されたディレクトリに配置することです。これにより、JVM全体が一貫してXercesを使用するようになります。私が知らない2.8.1について何か特別なことがない限り、それは問題全体をすぐに解決するかもしれません。

于 2010-06-24T13:25:21.580 に答える
2

java.endorsed.dirsシステムプロパティを設定することにより、jreを変更せずにlibsを承認できることに注意してください。

jdk1.6でEndorsedディレクトリを使用する正確な方法を確認してください

于 2013-10-09T07:21:33.223 に答える