自己用maven + struts2 + tiles 架出基礎架構
tiles是參考tutorialspoint
結果在裝tiles時遇到了這個Bug
二月 09, 2015 4:31:22 下午 org.apache.catalina.core.StandardContext listenerStart
嚴重: Error configuring application listener of class org.apache.struts2.tiles.StrutsTilesListener
java.lang.NoClassDefFoundError: org/apache/tiles/web/startup/TilesListener
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2957)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1210)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1690)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:529)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:511)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:139)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4888)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.apache.tiles.web.startup.TilesListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
... 19 more
原因在於我們在web.xml加了listener
<listener>
org.apache.struts2.tiles.StrutsTilesListener
</listener>
呼叫的是struts2-tiles-plugin這個jar檔的StrutsTilesListener(見圖左下)
但 StrutsTilesListener又extends TilesListener(見圖右)
TilesListener應該要在tiles-core這個jar檔中(文中使用到3.0.5版),但找不到了(見圖左上)
因此
1. struts2-tiles-plugin裡沒有StrutsTilesListener的話請修改到有StrutsTilesListener的版本
應該是2.2.1以上(無求證)
我目前使用過2.3.x 都有
2. tiles-core裡沒有TilesListener請修改tiles-core的版本聽說是2.0.x可使用(無求證)
我目前使用2.0.6
3. 若將tiles-core改成2.0.6後還有其他錯誤,請再檢查tiles-api及tiles-jsp,最好都改成同一版本,因為tiles-core會呼叫tiles-api,轉去jsp頁面時會呼叫tiles-js,它們同一國的!
結論:
採用
struts2-tiles-plugin.2.2.1.jar ↑
tiles-api.2.0.6.jar
tiles-jsp-2.0.6.jar
tiles-core-2.0.6.jar
得出這個結論參考了這裡
沒有留言:
張貼留言