簡體   English   中英

從lib文件夾中的類擴展WAR中的抽象類

[英]Extending an abstract class in the WAR from a class in the lib folder

我想啟用以下方案:

  • 我的Web應用程序(WAR文件)自己部署在Tomcat上

  • 我的Web應用程序以IFace接口和AbstractIFace抽象基礎實現的形式提供擴展API,其類文件部署在WAR文件中

  • 應用程序的擴展作為JAR文件提供,放置在類路徑中的某個位置(即WAR外部)

我編譯了一個ConcreteIFace類,它擴展了AbstractIFace並將其打包成一個JAR。 我將JAR放在$TOMCAT_HOME/lib並在webapps部署了WAR。 當我從WAR中的servlet嘗試以下內容時:

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

  • 是否有可能實現我在開始時提出的場景? 如果是這樣,怎么樣?

在Web應用程序中,類路徑是隔離的。 Web應用程序無法看到彼此的類,Tomcat無法看到應用程序的類,應用程序無法看到Tomcat的內部類(只有Servlet API等公開的接口)。

Web應用程序應該是獨立的,並且與容器無關。

最簡單的方法是重新打包war文件以包含插件。

其他選項包括上升到可以具有相互依賴性的企業歸檔,或者將Web服務器嵌入到應用程序中(而不是相反)。

您的API類位於WAR中,$ TOMCAT_HOME / lib中的類無法訪問它們。 一個建議是將您的API-a IFace和AbstractIFaceClass分開來分隔jar並將它放在$ TOMCAT_HOME / lib中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM