2015年2月9日 星期一

[Bug] java.lang.ClassNotFoundException: org.apache.tiles.web.startup.TilesListener

今天試著不要參考前輩建的環境架構
自己用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
得出這個結論參考了這裡

沒有留言:

張貼留言