訪問(wèn)AIX系統(tǒng)中部署在OC4J中的web
模塊的頁(yè)面時(shí)遇到這個(gè)錯(cuò)誤:
??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]
?????……
而當(dāng)在Windows環(huán)境下部署時(shí)就沒(méi)有問(wèn)題。
?
這里是因?yàn)?/span>IBM的AIX系統(tǒng)使用的是IBM的JDK。而出現(xiàn)這個(gè)問(wèn)題正是因?yàn)?/span>IBM和SUN的JDK的差異。 具體是因?yàn)?/span> $JAVA_HOME/jre/lib/jaxp.properties 這個(gè)文件。
這個(gè)文件以key=value的形式配置和指定實(shí)際使用的XML解析器實(shí)現(xiàn)類(譬如:javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl)。在XML解析器初始化之前,JDK首先會(huì)搜索System的properties尋找解析器的配置項(xiàng),如果沒(méi)有則會(huì)搜索 $JAVA_HOME/jre/lib 路徑下的 jaxp.properties 文件,如果還沒(méi)有,接下來(lái)會(huì)在classpath上的.jar包中尋找,仍然沒(méi)有的話就會(huì)使用默認(rèn)的解析器。
實(shí)際上這個(gè)文件在SUN的JDK中是不存在的。在找不到文件的情況下,最終將使用默認(rèn)解析器。在IBM的JDK中存在 jaxp.properties這個(gè)文件。但是這個(gè)文件中默認(rèn)所有的配置項(xiàng)是注釋掉的,所以在搜索到此處時(shí),不再繼續(xù)向下搜索,但是由于讀取不到配置項(xiàng),所以會(huì)返回null ,于是出現(xiàn)了上文的第一個(gè)錯(cuò)誤。第二個(gè)異常大概是因?yàn)樵L問(wèn)使用tiles框架的頁(yè)面時(shí),由于XML解析器初始化出錯(cuò),所以tiles框架的配置文件也就讀取不了了。