1. 程式人生 > >CXF在AIX+Weblogic環境下出現包衝突問題

CXF在AIX+Weblogic環境下出現包衝突問題

專案中碰到一個問題,折騰了半天才終於解決,記錄一下:

環境:AIX作業系統

    JDK1.7(IBM)

    Weblogic(10.3.3)

    Informix

專案架構是Struts2.3.15.1+Spring3.2.3.RELEASE+Hibernate4.2.3.Final,一個需求需要用到WebService,採用的是CXF的實現方式,本地啟動正常執行,在測試環境上用CXF做客戶端測試通過,但是CXF服務端卻提示異常,異常如下:

java.lang.VerifyError: JVMVRFY013 class loading constraint violated; class=com/sun/xml/bind/v2/runtime/unmarshaller/UnmarshallerImpl

, method=unmarshal(Ljavax/xml/stream/XMLEventReader;)Ljava/lang/Object;, pc=0
        at java.lang.J9VMInternals.verifyImpl(Native Method)
        at java.lang.J9VMInternals.verify(J9VMInternals.java:93)
        at java.lang.J9VMInternals.initialize(J9VMInternals.java:170)
        at com.sun.xml.bind.v2.runtime.JAXBContextImpl.createUnmarshaller(JAXBContextImpl.java:780)
        at com.sun.xml.bind.v2.runtime.JAXBContextImpl.createUnmarshaller(JAXBContextImpl.java:142)
        at org.apache.cxf.jaxb.io.DataReaderImpl.createUnmarshaller(DataReaderImpl.java:109)
        at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:160)
        at org.apache.cxf.binding.soap.interceptor.RPCInInterceptor.handleMessage(RPCInInterceptor.java:178)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
        at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
        at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
        at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
        at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
        at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
        at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
        at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
        at com.cib.oams.base.servlet.AbstractAppSessionFilter.doHttpFilter(AbstractAppSessionFilter.java:332)
        at com.cib.oams.base.servlet.HttpFilter.doFilter(HttpFilter.java:46)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.doIt(WebAppServletContext.java:3684)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3650)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2268)
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2174)
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1446)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)

        at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

網上找了很多資料,最終確認為包衝突,根據提示Ljavax/xml/stream/XMLEventReader,認定為XMLEventReader的引用異常,原因是因為JDK1.7已經集成了該實現,但是使用CXF的Maven依賴還是會引入stax-api這個包,本機沒問題是因為本機用的是jetty,沒有新增weblogic.xml這個配置檔案,該配置檔案主要用於讓weblogic優先使用本專案自身的實現,由於優先使用了stax-api的實現導致呼叫IBM的JDK異常。通過maven排除(exclusion)掉後依然報這個錯!繼續尋找關聯包,最終找到poi裡引用了geronimo-stax-api_1.0_spec,同樣的Ljavax/xml/stream/XMLEventReader,果斷排除,重新部署後服務端通過測試~ 

希望能給大家一些思路上到幫助!