在 Wildfly 的战争部署期间无法访问 jar 中的类

Posted

技术标签:

【中文标题】在 Wildfly 的战争部署期间无法访问 jar 中的类【英文标题】:classes in jar are not accessible during war deployment in Wildfly 【发布时间】:2017-04-19 14:21:03 【问题描述】:

我正在尝试将我的应用程序服务器从 JBoss4 迁移到 Wildfly 9。我的战争结构是

myWar.war
      - WEB-INF
           -lib
               -jar1   
               -jar2

当我在 Wildfly 中部署这场战争时,无法访问这些 jar 中的类 (ClassNotFoundException)。

阅读更多关于 Wildfly 的内容后,我了解到 Wildfly 中的类加载发生了变化,需要在文件 jboss-deployment-structure.xml 或 Manifest.mf 中明确提及依赖项

我有点困惑,有 2 个问题 -

    是否需要在 jboss-deployment-structure.xml 或 manifest.mf(作为里面的 jars 战争的库)? 如果是,如何准确指定 jars 的这种依赖关系?我尝试了一些通过 jar 名称/包提及依赖项的方法 jboss-deployment-structure.xml 等中的名称,但没有运气 (每次我缺少依赖项或模块未找到异常时, 等)

我还必须在 Wildfly 的模块目录下创建一个模块吗?但是这些 jar 是使用我的构建脚本动态创建并打包在 war 文件中的,所以我不能将 jar 放在 modules 文件夹(如quartz 或 mysql jar)下,因为它们不是静态的。

请帮忙。

【问题讨论】:

【参考方案1】:

war 的 lib 文件夹中的 jars 不需要在 MANIFEST.MF 或 jboss-deployment-structure.xml 中声明。

这些文件用于声明 Wildfly 模块的依赖项(例如 jdbc 驱动程序、cxf 依赖项等)。

您确定您的 ClassNotFoundException 来自您的战争 lib 文件夹中包含的 jars 吗?你不需要做任何特别的事情来从你的战争的 lib 文件夹中加载类。

【讨论】:

我在使用 wildfly 时遇到了同样的问题,我将 Gson 作为依赖项【参考方案2】:

Wildfly 9 确实需要一种特定方式的结构化网络存档。从战争结构来看,一切看起来都很好。重新检查战争结构是否符合 Widfly 9。正确的结构应该是这样的:

myWar.war
 ---WEB-INF
    ------- lib
           ---- Jar 1
           ---- Jar 2
    -------- classes
           ---- Your classeses here
    -------- web.xml

【讨论】:

以上是关于在 Wildfly 的战争部署期间无法访问 jar 中的类的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Wildfly (Jboss) 为 ws 端点访问 CXF jar

如何在 WildFly 10 中将爆炸战争部署为文件夹

域模式下的 Wildfly 不部署我的战争文件

使用 ubuntu 终端在 Wildfly 10.0.0 中部署我的战争文件

Wildfly 10 通过 http 管理 api 列出所有部署的战争工件

战争未部署到Wildfly 10.1中