次のシナリオを有効にします。
私のWebアプリケーション(WARファイル)はTomcatに単独でデプロイされます
私のWebアプリケーションは、
IFace
インターフェースとAbstractIFace
抽象ベース実装の形式で拡張機能用のAPIを提供し、そのクラスファイルはWARファイル内にデプロイされます。アプリケーションの拡張機能は、クラスパスのどこかに(つまり、WARの外部に)配置されるJARファイルとして提供されます。
それを拡張してJARにパッケージ化するConcreteIFace
クラスをコンパイルしました。AbstractIFace
JARを入れて$TOMCAT_HOME/lib
、WARをに配置しましたwebapps
。WARのサーブレットから次のことを試してみると:
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
ですか?最初に提示したシナリオを達成することさえ可能ですか?もしそうなら、どのように?