TomEE - ClassLoader 如何从 3 个 Web 应用程序加载

问题描述 投票:0回答:1

我正在致力于将一些现有的 Web 服务部署到 Apache TomEE 8。我有三个 Web 应用程序(EAR 文件)需要部署。我尝试独立部署它们中的每一个,它们工作正常,并且类加载器能够加载该特定应用程序所需的类。

但是,当我尝试将这三个应用程序部署在一起时,只有一个 Web 应用程序正常工作,而其余两个应用程序则抛出内部服务器错误。当我查看服务器日志时,我看到其他两个应用程序的

java.lang.ClassNotFoundException:com.example.classname
,但是,当我转到
TomEE-8/webapps/app1/WEB-INF/classes/
时,我能够看到引发异常的类。

所以我的问题是如何隔离每个应用程序的类加载器并将所有三个 EAR 部署在一起?我是 Tomcat 和 TomEE 的新手,很难弄清楚这一点。

以下是我的 TomEE 的部署目录结构:

  1. 对于 app1 - TomEE/webapps/app1/WEB-INF/classes/com/example/app1class1.class
  2. 对于 app2 - TomEE/webapps/app2/WEB-INF/classes/com/example/app2class1.class
  3. 对于 app3 - TomEE/webapps/app3/WEB-INF/classes/com/example/app3class1.class

我有一个公共库

common.jar
,类加载器应该使用它来加载类,我已将其放在
TomEE/lib
中。其余配置与安装时提供的相同。

为了部署,我将 app1.ear、app2.ear 和 app3.ear 文件放置在 webapps 目录中并启动服务器。

我预计所有三个 Web 服务都会运行,但只有其中一个在运行,大概是先部署的,其余两个则抛出

java.lang.ClassNotFoundException
。有人可以帮我解决这个问题吗?我一直在尝试寻找任何相关问题,但没有找到任何问题。

编辑-1:

以前的 Liberty 服务器配置:

<applicationManager autoExpand="true"/>
    <library id="commonlib"><fileset dir="path/to/common.jar"/></library>

    <application location="path/to/app1.ear" id = "app1.ear"
    name="app1.ear" type="ear"><classloader commonLibraryRef="commonlib"/></application>

    <application location="path/to/app2.ear" id = "app2.ear"
    name="app2.ear" type="ear"><classloader commonLibraryRef="commonlib"/></application>

    <application location="path/to/app3.ear" id = "app3.ear"
    name="app3.ear" type="ear"><classloader commonLibraryRef="commonlib"/></application>
java tomcat classloader apache-tomee tomee-8
1个回答
0
投票

TomEE 遵循树类加载。 您可以在那里看到继承的 tomcat (https://tomee.apache.org/tomee-8.0/docs/developer/classloading/index.html),然后对于您的应用程序,您将获得一个通用的类加载器(tomcat 的子级)并且然后每个 webapp 一个 webapp 类加载器(common 的子级)。

因此,您只需将 common 放入您的ear/lib 文件夹中(例如,请参阅 application.xml 中的库目录 - 或等效的内容),应该没问题。

如果您打算使用 common.loader 来共享您的公共 jar,您还必须将其依赖项放入 tomcat/lib 中,并将 Web 应用程序部署为 Web 应用程序,而不是作为 Ear。

最后一点:您可能需要配置 tomee.xml 以在 apps/ 中启用ear部署,而不是使用 webapps/ ,如果尚未完成,它有特定的处理(理论上它应该有效,但它有副作用,所以最好不要使用它) 。如果您愿意,您还可以查看 https://tomee.apache.org/tomee-8.0/docs/deployments.html - 它提出了替代配置。

如果无法加载通用 lib 类,因此在您的情况下无法传递加载 webapp 类,会发生什么情况。

© www.soinside.com 2019 - 2024. All rights reserved.