私はこの対立に最初に遭遇したのではないと確信しています。
私が継承したコードは次のことを行います。
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
[私が思うに注意深い読者には驚くことではありません]
助言がありますか?