如何将Wildfly中的WAR类加载限制为仅限WEB-INF文件夹(在EAR / lib文件夹中没有可见性)?

时间:2017-06-15 20:04:31

标签: wildfly classloader

我正在尝试向现有EAR添加自包含WAR。鉴于我的新WAR有一些更新的库,我想不惜一切代价确保与我的EAR中存在的任何现有库没有冲突。

目前,我的EAR结构为:

EAR:
 - webapp1.war
 - ejb.jar
 - lib/lib1.jar
      /lib2.jar
      /lib3.jar
 - webapp2.war  <-- the new self-contained war

为了限制任何潜在的冲突,我将我的webapp2.war打包为一个完全自包含的WAR,其所有依赖项都在WEB-INF / lib文件夹中。但更确切地说,我想将webapp2的类加载器限制为其WEB-INF / classes和WEB-INF / lib文件夹。

我找到了Wildfly的this classloading reference,但我在文档中找到的唯一内容是exclude-subsystems标记:

的JBoss部署-structure.xml:

<jboss-deployment-structure>
  <sub-deployment name="myapp.war">
    <!-- Exclusions allow you to prevent the server from automatically adding some dependencies     -->
    <exclusions>
        <module name="" />
    </exclusions>
  </sub-deployment>
</jboss-deployment-structure>

但我读到这意味着我需要为ear / lib文件夹中的每个lib(即:module)创建一个新的子系统条目。哪个不太容易管理。另外,我甚至没有100%清楚模块名称应该是什么?

  • deployment.ear.ear.lib1.jar?
  • ear.ear.lib2.jar?
  • ear.ear.lib3.jar?

有没有办法简单地告诉类加载器忽略EAR / lib文件夹中的所有模块/库?是否有一个maven插件我可以用来为我自动生成这个?

1 个答案:

答案 0 :(得分:1)

最简单的方法是单独部署WAR。

如果你真的需要这样做,那么只需在EAR中加入WAR即可正常工作

除了Java EE / SE规范提供的API之外,在类加载器查看EAR和其他地方之前,将始终看到WAR文件的WEB-INF / lib(和类)目录中的所有其他内容。这是规范要求。

如果你忘记了一个图书馆并且从EAR中挑选了一个班级,事情会变得混乱。该类可能返回一个引用您的一个重复库的对象,从而导致奇怪的类访问问题。