- JDK: 5.0 升到 8.0
- IBM WebSphere Application Server: 6.0 升到 8.5.5.x
- spring framework: 2.5.6 升到 4.3.7,且全部的 xml 設定都改為用 annotation。
- hibernate: 3.3.x 升到 5.2.4,且程式都用 JPA 改寫。
- Ajax: 由 DWR (Direct Web Remoting) 換為 jQuery
當然是有花了一些時間,也請了幾個同事協助修改以加快進度,好不容易改完,要部署到 WAS 時,遇到很多 jar 檔的問題,這裡記錄幾個,下面是安裝過程遇到的錯誤訊息及解決辦法。
遇到這些錯誤從錯誤訊息基本上都可以找到蛛絲馬跡,我用紅色標起來的部份,可以看到因為 jar 檔版本升級或被廠商修改過,程式內容已經不一樣了,造成型別錯誤、找不到該有的 method 等,用這些關鍵字先 google 一下,網路上多半會有人已經找到有問題的 jar 檔,如果 google 不到,就是考驗經驗、實力和耐心的開始了 ...
遇到這些錯誤從錯誤訊息基本上都可以找到蛛絲馬跡,我用紅色標起來的部份,可以看到因為 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 以上版本就可解決了。
這個猜測是 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 有關的 jar 檔衝突,移除 geronimo-stax-api_1.0_spec-1.0.1.jar 即可。
- 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)
- 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]
- 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 包衝突