0

次のシナリオを有効にします。

  • 私のWebアプリケーション(WARファイル)はTomcatに単独でデプロイされます

  • 私のWebアプリケーションは、IFaceインターフェースとAbstractIFace抽象ベース実装の形式で拡張機能用のAPIを提供し、そのクラスファイルはWARファイル内にデプロイされます。

  • アプリケーションの拡張機能は、クラスパスのどこかに(つまり、WARの外部に)配置されるJARファイルとして提供されます。

それを拡張してJARにパッケージ化するConcreteIFaceクラスをコンパイルしました。AbstractIFaceJARを入れて$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直接実装する場合、同様のスタックトレースが表示されますIFaceAbstractIFace

私の質問は次のとおりです。

  • 必要なすべてのクラスがアプリケーションのクラスパスにあるのに、なぜ私は持っているのNoClassDefFoundですか?

  • 最初に提示したシナリオを達成することさえ可能ですか?もしそうなら、どのように?

4

2 に答える 2

2

Webアプリケーションでは、クラスパスは分離されています。Webアプリケーションはお互いのクラスを見ることができず、Tomcatはアプリのクラスを見ることができず、アプリはTomcatの内部クラスを見ることができません(サーブレットAPIのような公開されたインターフェースのみ)。

Webアプリケーションは、自己完結型で、コンテナーに依存しないことになっています。

最も簡単な方法は、warファイルを再パッケージ化してプラグインも含めることです。

他のオプションには、相互依存関係を持つ可能性のあるエンタープライズアーカイブへのアクセス、またはアプリケーションへのWebサーバーの埋め込みが含まれます(その逆とは対照的です)。

于 2012-07-17T08:53:06.943 に答える
0

APIクラスはWARにあり、$ TOMCAT_HOME/libのクラスにはアクセスできません。1つの提案は、APIを分離することです。IFaceとAbstractIFaceClassを分離してjarを分離し、$ TOMCAT_HOME/libに配置します。

于 2012-07-17T08:57:59.943 に答える