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

时间:2015-12-03 16:30:36

标签: java maven jar jboss classloader

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

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

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

EntityBase是一个公共抽象类。 Project是一个扩展EntityBase的公共类。这两个类都已移到我的新jar库中。这个错误让我得出结论,类加载器存在问题。

我的耳朵结构如下:

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中的所有类都加载了相同的类加载器?

1 个答案:

答案 0 :(得分:1)

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

provided

然后,我通过向model.jar添加一个没有scope标记的依赖项来修改myapp.ear的pom.xml(这将为依赖项提供默认范围,我认为是<dependency> <groupId>myproject</groupId> <artifactiId>model</artifactId> <version>0.0.1-SNAPSHOT</version> <scope>provided</scope> </dependency> ):

compile