Google Code Prettify

2017年3月30日 星期四

在 WebSphere 8.5.5.x 上遇到的 jar 檔版本和衝突問題

最近將自己負責的一個系統升級,升級的項目主要有以下幾項:
  1. JDK: 5.0 升到 8.0
  2. IBM WebSphere Application Server: 6.0 升到 8.5.5.x
  3. spring framework: 2.5.6 升到 4.3.7,且全部的 xml 設定都改為用 annotation。
  4. hibernate: 3.3.x 升到 5.2.4,且程式都用 JPA 改寫。
  5. Ajax: 由 DWR (Direct Web Remoting) 換為 jQuery
當然是有花了一些時間,也請了幾個同事協助修改以加快進度,好不容易改完,要部署到 WAS 時,遇到很多 jar 檔的問題,這裡記錄幾個,下面是安裝過程遇到的錯誤訊息及解決辦法。

遇到這些錯誤從錯誤訊息基本上都可以找到蛛絲馬跡,我用紅色標起來的部份,可以看到因為 jar 檔版本升級或被廠商修改過,程式內容已經不一樣了,造成型別錯誤、找不到該有的 method 等,用這些關鍵字先 google 一下,網路上多半會有人已經找到有問題的 jar 檔,如果 google 不到,就是考驗經驗、實力和耐心的開始了 ...
  • xercesImpl
ServletWrappe E com.ibm.ws.webcontainer.servlet.ServletWrapper init SRVE0271E: 未捕捉到應用程式中Servlet [application] 產生的init() 異常狀況:java.lang.IncompatibleClassChangeError
        at org.dom4j.tree.AbstractElement.setAttributes(AbstractElement.java:505)
        at org.dom4j.io.SAXContentHandler.addAttributes(SAXContentHandler.java:916)
        at org.dom4j.io.SAXContentHandler.startElement(SAXContentHandler.java:249)
        at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
        at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
        at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
怎麼解決? 基本也只能從訊息中猜測,是不是 jar 檔版本太舊沒有更新? 並嘗試更新幾個 jar 檔試看看,最後是把 xercesImpl-2.8.1.jar 升級到 2.9.1 以上版本就可解決了。
  • javax.el-api
webapp        E com.ibm.ws.webcontainer.webapp.WebApp initializeExtensionProcessors SRVE0280E: 在 Factory [com.ibm.ws.jsp.webcontainerext.ws.WASJSPExtensionFactory@f87c2d7d] 中,延伸規格處理器無法起始設定:java.lang.ClassCastException: org.apache.el.ExpressionFactoryImpl incompatible with javax.el.ExpressionFactory
        at javax.el.ExpressionFactory.newInstance(ExpressionFactory.java:210)
        at javax.el.ExpressionFactory.newInstance(ExpressionFactory.java:118)
        at com.ibm.ws.jsp.configuration.JspConfiguration.<init>(JspConfiguration.java:63)
        at com.ibm.ws.jsp.configuration.JspConfigurationManager.createJspConfiguration(JspConfigurationManager.java:202)
        at com.ibm.ws.jsp.taglib.TagLibraryCache.loadWebInfTagFiles(TagLibraryCache.java:444)
        at com.ibm.ws.jsp.taglib.TagLibraryCache.<init>(TagLibraryCache.java:117)
        at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionProcessor.<init>(AbstractJSPExtensionProcessor.java:215)
        at com.ibm.ws.jsp.webcontainerext.ws.WASJSPExtensionProcessor.<init>(WASJSPExtensionProcessor.java:81)
        at com.ibm.ws.jsp.webcontainerext.ws.WASJSPExtensionFactory.createProcessor(WASJSPExtensionFactory.java:267)
        at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionFactory.createExtensionProcessor(AbstractJSPExtensionFactory.java:76)
        at com.ibm.ws.webcontainer.webapp.WebApp.initializeExtensionProcessors(WebApp.java:1408)
這個猜測是 JSP 上的 EL (Expression Language) 相關的 jar 檔和 WAS 的 jar 檔衝突了,於是找到 java.el-api-2.2.4.jar 將它刪除。事實上,在 war 檔中不應該含有 servlet-api.jar, jsp-api.jar, el-api.jar, j2ee.jar, javaee.jar 這些 jar 檔,否則都會有錯誤。
  • xml-apis
Caused by: javax.xml.parsers.FactoryConfigurationError: Provider javax.xml.parsers.DocumentBuilderFactory could not be instantiated: java.util.ServiceConfigurationError: javax.xml.parsers.DocumentBuilderFactory: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not a subtype
        at javax.xml.parsers.DocumentBuilderFactory.newInstance(Unknown Source)
        at com.ibm.websphere.product.utils.SimpleXMLParser.getDocumentBuilderWithEntityResolver(SimpleXMLParser.java:760)
        at com.ibm.websphere.product.utils.SimpleXMLParser.<init>(SimpleXMLParser.java:198)
        at com.ibm.websphere.product.utils.SimpleXMLParser.<init>(SimpleXMLParser.java:176)
        at com.ibm.websphere.product.metadata.im.IMMetadata.parseInstalledXmlFile(IMMetadata.java:422)
        at com.ibm.websphere.product.metadata.im.IMMetadata.parseInstallRegistryFiles(IMMetadata.java:364)
這個錯誤看來是和 xml 相關的 jar 檔有關,但是和 xml 有關的 jar 檔很多,很難確定是那一個,會找到 xml-apis-2.0.2.jar,是 google 得到的答案,因為這個 jar 檔和 javax.xml 裡的相關 API 衝突了,刪除這個檔案即可。
  • geronimo-stax-api_1.0_spec-1.0.1.jar
Exception occurred while the JNDI NamingManager was processing a javax.naming.Reference object. [Root exception is javax.xml.stream.FactoryConfigurationError: Provider javax.xml.stream.XMLInputFactory could not be instantiated: java.util.ServiceConfigurationError: javax.xml.stream.XMLInputFactory: Provider com.ctc.wstx.stax.WstxInputFactory not a subtype]
這也是和 xml 有關的 jar 檔衝突,移除 geronimo-stax-api_1.0_spec-1.0.1.jar 即可。
  • persistence-api-1.0.2.jar
Caused by: java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
    at org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor.getValidationMode(PersistenceUnitInfoDescriptor.java:88)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.mergeSettings(EntityManagerFactoryBuilderImpl.java:454)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:199)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:163)
看起來是 JPA 相關的 jar 檔版本有衝突,我想用的是 hibernate-jpa-2.1-api-1.0.0.Final.jar,但是實際上用到舊的,找了一下發現是 persistence-api-1.0.2.jar 也有相關的 class,刪除即可。
[see also] 如何在 WebSphere 中解決 jar 包衝突




沒有留言:

張貼留言