Weblogicサーバーを9から10.3.6にアップグレードしています。 EARアプリケーションをデプロイしようとして、例外を下回ったとき。
Caused By: Java.lang.ClassCastException: org.Apache.xerces.jaxp.DocumentBuilderFactoryImpl cannot be cast to javax.xml.parsers.DocumentBuilderFactory
at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.Java:123)
at org.springframework.beans.factory.xml.DefaultDocumentLoader.createDocumentBuilderFactory(DefaultDocumentLoader.Java:89)
at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.Java:70)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.Java:396)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.Java:342)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.Java:310)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:143)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:178)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:149)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:212)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.Java:113)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.Java:80)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.Java:123)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.Java:423)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:353)
at org.springframework.context.access.ContextSingletonBeanFactoryLocator.initializeDefinition(ContextSingletonBeanFactoryLocator.Java:141)
at org.springframework.beans.factory.access.SingletonBeanFactoryLocator.useBeanFactory(SingletonBeanFactoryLocator.Java:384)
at org.springframework.web.context.ContextLoader.loadParentContext(ContextLoader.Java:341)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.Java:195)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.Java:45)
at weblogic.servlet.internal.EventsManager$FireContextListenerAction.run(EventsManager.Java:481)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.Java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.Java:120)
at weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.Java:181)
at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.Java:1868)
Weblogic-application.xmlの追加など、さまざまなことを試しましたが、それでも機能しません。
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application>
<xml>
<parser-factory>
<saxparser-factory>
org.Apache.xerces.jaxp.SAXParserFactoryImpl
</saxparser-factory>
<document-builder-factory>
org.Apache.xerces.jaxp.DocumentBuilderFactoryImpl
</document-builder-factory>
<transformer-factory>
org.Apache.xalan.processor.TransformerFactoryImpl
</transformer-factory>
</parser-factory>
</xml>
<prefer-application-packages>
<package-name>org.Apache.xerces.parsers.*</package-name>
</prefer-application-packages>
</weblogic-application>
私のweblogic.xmlには
<prefer-web-inf-classes>true</prefer-web-inf-classes>
これは私のpom.xmlの一部です:
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.8.1</version>
<scope>runtime</scope>
</dependency>
助けてください。ありがとう!
私は自分の質問に答えます:
以下のリンクから、この問題を修正するようになりました。
Java/Mavenで「Xerceshell」を処理しますか?
基本的に、pom.xmlのxml-apiとxmlParserAPIのすべての依存関係を削除しました。問題は修正されました。根本的な原因は、クラスパスに、ライブラリがWeblogicアプリサーバーと競合する原因となるjavaxライブラリを含めないことです。それが役に立てば幸い。
私も同様の問題を抱えていました。ワイルドサーバーにインストールされたアプリケーションを使用していました。問題は、xercesjarをフレームワークとアプリケーションのサードパーティのlibフォルダーの両方に配置する必要があることでした。多くの調査の結果、xercesのドキュメントで解決策を見つけました。
XercesとWebSphereApplication Serverを使用しているときにClassCastExceptionが発生するのはなぜですか? XercesはObjectFactoryクラスを使用して、いくつかのクラスを動的にロードします。パーサー構成。 ObjectFactoryは、システムプロパティをクエリするか、META-INF/services/factoryIdファイルを読み取るか、フォールバッククラス名を使用して、指定された実装クラスを検索します。実装が見つかった後、ObjectFactoryはコンテキストクラスローダーを使用してファイルをロードしようとします。ファイルがnullの場合、ObjectFactoryはシステムクラスローダーを使用します。複数のクラスローダーがあるWebSphere®ApplicationServerなどの環境でXercesを実行する場合、異なるクラスローダーがXercesクラスのロードに関与する可能性があるため、XercesからClassCastExceptionsがスローされる可能性があります。たとえば、ClassCastExceptionsは、Xercesを使用するユーティリティEARクラスがWARモジュールからXercesクラスをロードするときに発生する可能性があります。この問題の回避策を説明している「ClassCastExceptionsの回避...」の記事を読むことをお勧めします。また、WebSphere ApplicationServerで複数のクラスローダーがどのように機能するかを説明している「J2EEClassLoadingDemystified」の記事を読むことをお勧めします。
「」
基本的に、2つのutilクラスを使用してdomparserオブジェクトを作成します。アプリケーションからのサービス呼び出しでは、クラスローダーを変更してオブジェクトを作成します。処理を行った後、クラスローダーを元に戻します。
ClassLoader savedClassLoader = Thread.currentThread().getContextClassLoader();
ClassLoader currentClassLoader = this.getClass().getClassLoader() ;
Thread.currentThread().setContextClassLoader(currentClassLoader);
//do the processing, after that revert back