最近在學(xué)習(xí)Struts2的時(shí)候,總是無(wú)法啟動(dòng)Tomcat服務(wù)器,報(bào)錯(cuò)如下,用6.0、7.0都不行,起初以為是環(huán)境的問(wèn)題,弄了一下午還是不行。我用的Strtus jar是2.16但是前幾天做項(xiàng)目還是好好,可切換個(gè)工作空間卻就老是報(bào)如下的錯(cuò)誤,甚是煩人。在網(wǎng)上轉(zhuǎn)了好久,用試用了他的很多方法都不能解決問(wèn)題。
1.strtus.xml
在struts.xml中配置了<constant name="struts.devMode" value="true"/> (據(jù)說(shuō)配置了<constant name="struts.configuration.xml.reload" value="true"/>也會(huì)報(bào)錯(cuò),這個(gè)我沒(méi)試過(guò))
時(shí)啟動(dòng)tomcat報(bào)錯(cuò)。
org.apache.catalina.core.StandardContext filterStart
嚴(yán)重: Exception starting filter struts2
java.lang.NullPointerException
at com.opensymphony.xwork2.util.FileManager$FileRevision.needsReloading(FileManager.java:209)
at com.opensymphony.xwork2.util.FileManager.fileNeedsReloading(FileManager.java:60)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.needsReload(XmlConfigurationProvider.java:325)
at org.apache.struts2.config.StrutsXmlConfigurationProvider.needsReload(StrutsXmlConfigurationProvider.java:168)
at com.opensymphony.xwork2.config.ConfigurationManager.conditionalReload(ConfigurationManager.java:220)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:61)
at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:774)
at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:191)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3709)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4363)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2009-2-4 22:40:54 org.apache.catalina.core.StandardContext start
嚴(yán)重: Error filterStart
2009-2-4 22:40:54 org.apache.catalina.core.StandardContext start
嚴(yán)重: Context [/Struts2Demo2] startup failed due to previous errors
網(wǎng)上解決辦法:devMode模式是開(kāi)發(fā)模式,開(kāi)啟它則默認(rèn)開(kāi)啟了i18n.reload、 configuration.xml.reload。這個(gè)錯(cuò)誤是由于configuration.xml.reload設(shè)置為true倒置的,但是網(wǎng)上的資料沒(méi)有說(shuō)明原因及解決辦法,倒是一個(gè)國(guó)外的apache相關(guān)BBS上有人說(shuō)這是216版本的BUG,并且附上了一個(gè).patch修正文件,說(shuō)217版本會(huì)修正。。。可我不會(huì)用也不知道是不是這個(gè)原因,這個(gè)問(wèn)題就一直擱置在這里了。過(guò)了幾個(gè)月,也就是最近網(wǎng)上查了下發(fā)現(xiàn)在apache的一個(gè)郵件列表中有關(guān)于這個(gè)的解釋,原因很簡(jiǎn)單,tomcat的安裝路徑包含空格我的成功的辦法:據(jù)說(shuō)這是struts2.1.6的bug,換新版本2.1.8就ok,當(dāng)然還要相應(yīng)的xwork版本,好像是xwork2.1.6,我將原來(lái)的2個(gè)舊jar包換成新的就ok了。。。。無(wú)語(yǔ)啊。。。一試果然如此。
注意:2個(gè)jar包換了之后重啟tomcat可能會(huì)報(bào)錯(cuò), Unable to load bean: type: class:com.opensymphony.xwork2.ObjectFactory - bean - jar,這個(gè)錯(cuò)誤是開(kāi)始那個(gè)引起的,把tomcat中相應(yīng)項(xiàng)目刪除了,重新部署就沒(méi)問(wèn)題了
下面是4個(gè)開(kāi)發(fā)模式常用配置的簡(jiǎn)介---(來(lái)自http://hi.baidu.com/12261016/blog/item/1d7f6ccaded7248ec91768ec.html)
<!-- 開(kāi)啟使用開(kāi)發(fā)模式,詳細(xì)錯(cuò)誤提示 -->
<!-- <constant name="struts.devMode" value="true"/>-->
<!-- 指定每次請(qǐng)求到達(dá),重新加載資源文件 -->
<!-- <constant name="struts.i18n.reload" value="true"/>-->
<!-- 指定每次配置文件更改后,自動(dòng)重新加載 -->
<!-- <constant name="struts.configuration.xml.reload" value="true"/>-->
<!-- 指定XSLT Result使用樣式表緩存 -->
<!-- <constant name="struts.xslt.nocache" value="true"/>-->