我想啓用以下情形:lib文件夾中擴展在戰爭時期的抽象類與類
我的web應用程序(WAR文件)部署在Tomcat自身
我的web應用程序提供了一個API,用於擴展在
IFace
接口的形式和AbstractIFace
抽象的基本實現,它的類文件在WAR文件中部署擴展的應用程序作爲JAR文件提供以放置在類路徑中的某個位置(即,外部WAR)
我編譯一個ConcreteIFace
類延伸AbstractIFace
並將其打包成JAR。我把JAR放入$TOMCAT_HOME/lib
,並將WAR部署在webapps
。
Class clazz = Class.forName("ConcreteIFace");
我碰到下面的堆棧跟蹤:
java.lang.NoClassDefFoundError: AbstractIFace
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
java.lang.ClassLoader.defineClass(ClassLoader.java:615)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
java.net.URLClassLoader.access$000(URLClassLoader.java:58)
java.net.URLClassLoader$1.run(URLClassLoader.java:197)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(URLClassLoader.java:190)
java.lang.ClassLoader.loadClass(ClassLoader.java:306)
java.lang.ClassLoader.loadClass(ClassLoader.java:247)
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:247)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1698)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:169)
com.backbase.sample.DummyServlet.service(DummyServlet.java:14)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
類似的堆棧跟蹤,提出如果ConcreteIFace
直接實現IFace
,而不是通過AbstractIFace
我的問題是:
,因爲所有必需的類都在應用程序類路徑中,爲什麼我有
NoClassDefFound
?甚至有可能實現我在開始介紹的場景嗎?如果是這樣,怎麼樣?
我明白這一點,謝謝。但顯然,應用程序*可以*訪問容器類,而相反的問題則在於:查看與「AbstractIFace」有關的錯誤,這意味着'ConcreteIFace'確實被發現並正在被加載。對? – skuro 2012-07-17 09:29:14
是的,應用程序可以看到(某些)容器類,但不是相反。 ConcreteFace是容器的一部分(現在你把它移動到了lib中),所以它不能看到它的父類(它是應用程序的一部分)。當你編譯它時,你必須讓它訪問應用程序中的類,對吧?如果你想使用TOMCAT_HOME/lib,你必須把所有這些東西分解成一個jar文件,就像@Slavus所說的那樣。 – Thilo 2012-07-17 10:07:09