訪問AIX系統中部署在OC4J中的web
模塊的頁面時遇到這個錯誤:
??javax.xml.parsers.FactoryConfigurationError: Provider null could not be instantiated:?????????
????java.lang.NullPointerException
????????at javax.xml.parsers.SAXParserFactory.newInstance(Unknown Source)
????????at org.apache.commons.digester.Digester.getFactory(Digester.java:478)
????????at org.apache.commons.digester.Digester.getParser(Digester.java:683)
????????at org.apache.commons.digester.Digester.getXMLReader(Digester.java:891)
????????at org.apache.commons.digester.Digester.parse(Digester.java:1591)
????????at org.apache.struts.action.ActionServlet.initServlet(ActionServlet.java:1433)
????????at org.apache.struts.action.ActionServlet.init(ActionServlet.java:466)
????????at javax.servlet.GenericServlet.init(GenericServlet.java:256)
????????at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpApplication.loadServlet(HttpApplication.java:2231)
????????at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpApplication.findServlet(HttpApplication.java:4617)
????????……
或者這樣的異常:
??
javax.servlet.jsp.JspException: Can't get definitions factory from context.
?????at org.apache.struts.taglib.tiles.InsertTag.processDefinitionName(InsertTag.java:583)
?????at org.apache.struts.taglib.tiles.InsertTag.createTagHandler(InsertTag.java:487)
?????at org.apache.struts.taglib.tiles.InsertTag.doStartTag(InsertTag.java:451)
?????at _welcome._jspService(_welcome.java:54)
?????[SRC:/welcome.jsp:4]
?????……
而當在Windows環境下部署時就沒有問題。
?
這里是因為IBM的AIX系統使用的是IBM的JDK。而出現這個問題正是因為IBM和SUN的JDK的差異。 具體是因為 $JAVA_HOME/jre/lib/jaxp.properties 這個文件。
這個文件以key=value的形式配置和指定實際使用的XML解析器實現類(譬如:javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl)。在XML解析器初始化之前,JDK首先會搜索System的properties尋找解析器的配置項,如果沒有則會搜索 $JAVA_HOME/jre/lib 路徑下的 jaxp.properties 文件,如果還沒有,接下來會在classpath上的.jar包中尋找,仍然沒有的話就會使用默認的解析器。
實際上這個文件在SUN的JDK中是不存在的。在找不到文件的情況下,最終將使用默認解析器。在IBM的JDK中存在 jaxp.properties這個文件。但是這個文件中默認所有的配置項是注釋掉的,所以在搜索到此處時,不再繼續向下搜索,但是由于讀取不到配置項,所以會返回null ,于是出現了上文的第一個錯誤。第二個異常大概是因為訪問使用tiles框架的頁面時,由于XML解析器初始化出錯,所以tiles框架的配置文件也就讀取不了了。