我正在致力于将一些现有的 Web 服务部署到 Apache TomEE 8。我有三个 Web 应用程序(EAR 文件)需要部署。我尝试独立部署它们中的每一个,它们工作正常,并且类加载器能够加载该特定应用程序所需的类。
但是,当我尝试将这三个应用程序部署在一起时,只有一个 Web 应用程序正常工作,而其余两个应用程序则抛出内部服务器错误。当我查看服务器日志时,我看到其他两个应用程序的
java.lang.ClassNotFoundException:com.example.classname
,但是,当我转到 TomEE-8/webapps/app1/WEB-INF/classes/
时,我能够看到引发异常的类。
所以我的问题是如何隔离每个应用程序的类加载器并将所有三个 EAR 部署在一起?我是 Tomcat 和 TomEE 的新手,很难弄清楚这一点。
以下是我的 TomEE 的部署目录结构:
我有一个公共库
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>
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 类,会发生什么情况。