在 JBoss 应用程序服务器中,如何确保部署中的所有模块对 jar 库使用相同的类加载器?

In JBoss application server, how do I make sure that all modules in a deployment use the same Classloader for a jar library?

我有一个可部署的耳朵,我正在将其部署到 JBoss 应用程序服务器。我正在重构我的代码,以便我的实体 classes 在一个单独的 jar 库中声明,该库可以由 ear 中的不同模块共享。

但是,我现在收到以下错误:

java.lang.ClassCastException: model.project.Project cannot be cast to model.EntityBase

EntityBase 是一个 public 摘要 class。 Project 是扩展 EntityBase 的 public class。两个 classes 都已移至我的新 jar 库。这个错误让我得出结论,classloader.

有问题

我的耳朵结构如下:

myapp.ear
 |
 |--- webportal.war
 |--- restapi.war
 |--- dal.jar

我的实体已在 dal.jar 中定义,war 库使用它来访问我的数据库。我现在已经从 dal.jar 中删除实体并将它们放在单独的 model.jar 中。我已将 model.jar 列为 myapp.ear 的 pom.xml 的依赖项。它还在 webportal.war、restapi.war 和 dal.jar 的 pom.xml 文件中列为依赖项。因此,model.jar 现在部署在 myapp.ear 内的 lib 目录中。

我对 ClassCastException 原因的理解是否正确?如果是这样,我如何打包我的应用程序以确保 model.jar 中的所有 classes 都使用相同的 classloader 加载?

事实证明这是一个相对简单的解决方案。我修改了 webportal.war、restapi.war 和 dal.jar 的 pom.xml 文件,方法是为模型依赖项添加一个值为 providedscope 标记:

<dependency>
    <groupId>myproject</groupId>
    <artifactiId>model</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <scope>provided</scope>
</dependency>

然后我修改了 pom.xml 为 myapp.ear 通过添加一个依赖到 model.jar 没有范围标签(这会给依赖默认范围,我认为是 compile):

<dependency>
    <groupId>myproject</groupId>
    <artifactiId>model</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>