JBoss 中的基本 ear-package 部署

Posted

技术标签:

【中文标题】JBoss 中的基本 ear-package 部署【英文标题】:Basic ear-package deployment in JBoss 【发布时间】:2016-01-25 16:42:16 【问题描述】:

这就是我想要实现的目标:

1个耳包:all.ear ear-package包含两个war的(A.war,B.war在耳朵的根) ear-package包含1个自制jar C和大量第三方jar(APP-INF\lib下)

这个包需要部署在JBoss WildFly 8.2.1上

我正在使用 maven 的 ear 插件(maven-ear-plugin,版本 2.10.1)。我在 pom 中的配置如下所示(这是结合了其他三个项目的“父”项目):

<configuration>
    <finalName>All</finalName>
    <defaultLibBundleDir>APP-INF/lib</defaultLibBundleDir>
    <includeLibInApplicationXml>true</includeLibInApplicationXml>
    <version>6</version>
    <displayName>All</displayName>
    <modules>
        <jarModule>
            <groupId>project</groupId>
            <artifactId>C</artifactId>
            <bundleFileName>C.jar</bundleFileName>
            <uri>APP-INF/lib/C.jar</uri>
            <bundleDir>APP-INF/lib</bundleDir>
        </jarModule>
        <webModule>
            <groupId>project</groupId>
            <artifactId>A</artifactId>
            <uri>A.war</uri>
            <bundleFileName>A.war</bundleFileName>
            <contextRoot>/a</contextRoot>
            <bundleDir>/</bundleDir>
        </webModule>
        <webModule>
            <groupId>project</groupId>
            <artifactId>B</artifactId>
            <uri>B.war</uri>
            <bundleFileName>B.war</bundleFileName>
            <contextRoot>/b</contextRoot>
            <bundleDir>/</bundleDir>
        </webModule>
    </modules>
    <archive>
        <manifestEntries>
            <Implementation-Version>1.0</Implementation-Version>
        </manifestEntries>
    </archive>
</configuration>

我的 META.INF/application.xml 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="6"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_6.xsd">
    <display-name>All</display-name>
    <initialize-in-order>true</initialize-in-order>
    <module>
        <java>APP-INF/lib/C.jar</java>
    </module>
    <module>
        <web>
            <web-uri>B.war</web-uri>
            <context-root>b</context-root>
        </web>
    </module>
    <module>
        <web>
            <web-uri>A.war</web-uri>
            <context-root>a</context-root>
        </web>
    </module>
    <library-directory>APP-INF/lib</library-directory>
</application>

耳包制作完成。所有第三方jar都在APP-INF/lib下,但是C.jar在根目录下。

我在尝试将包上传到 JBoss 时遇到了很多错误:

 Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS016703: Module may not be a child of the EAR's library directory. Library directory: APP-INF/lib, module file name: APP-INF/lib/[SomeThirthPartyLib].jar"

当我将每个库都放在根目录下(不要使用 APP-INF)时,B.war 出现 ClassNotFoundError(无法从 C.jar 中找到类)。

我已经尝试将“jboss”标签添加到 maven-ear-plugin(配置),但 JBoss 8+ 不支持这些标签。

我想要一个可以部署在 JBoss 中的 .ear 包,其中包含 2 个战争和 1 个 jar,这两个战争都引用了它。

我错过了什么? (具体的 Manifest 配置?针对 A、B 或 C 的具体 pom.xml 设置?JBoss 设置?...?)

【问题讨论】:

C.jar 里面有什么?如果它只是一个实用程序 jar(只是里面的 pojos),它应该放在 lib 文件夹中.. 并且要做到这一点,不要将 C 作为耳模块嵌入,它应该是战争的依赖项..跨度> C.jar 包含业务对象和数据访问对象。其中一些是单例并且有缓存。这就是为什么我只能有一个实例(否则会有一个重复的缓存)。它是提供范围的两场战争的依赖项。 如果 C.jar 有单例和业务对象,那么放在耳朵根部就可以了。你为什么要把它放在 lib 文件夹中?如果在根目录下部署 A、B 和 C,其余的 jar 包都在 lib 文件夹中,部署错误是什么? ClassNotFoundError on deployment (B can't resolve classes to C) 您更新了 application.xml 并从模块声明中删除了 APP-INF/lib/ 路径,对吗?我的意思是,C 应该在根目录中,而您的 application.xml 正在尝试从 lib 文件夹中引用它 【参考方案1】:

错误“WFLYEE0097:模块可能不是子模块”的解决方案 EAR 的库目录”:错误是因为 application.xml 中的标记 APP-INF/lib。如果库 jar 在 EAR/lib 中,那么 application.xml 将正常工作,因为它在 EAR/APP-INF/lib 下, jboss或wildfly不会理解这个(appication.xml)部署描述符。所以使用wildfly可以理解的jboss-app.xml,即使库目录不同。解决方案:只需将application.xml的完整内容复制到jboss-app.xml并将它放在 META-INF 文件夹中(还要确保删除 application.xml 文件或不使其通过 pom.xml 生成)

【讨论】:

【参考方案2】:

根据 JAVA EE 规范,容器不会扫描 ear 库目录中包含的任何 jar 的任何部署描述符。

但我认为您想要做的是从 WAR 访问您在 C.jar 中声明的那些 ejb。同样,根据规范,任何坐在耳朵里的 ejb-jar 对任何其他模块都是可见的:

Web 容器中的组件可以访问以下类和资源。便携式应用程序不得依赖于是否可以访问这些类或资源。 • 同一ear 文件中包含的任何其他Web 模块可访问的类和资源,如上所述。 • 同一ear 文件中包含的任何EJB jar 文件的内容。

所以,只需将 C.jar 放在 lib 目录以外的任何其他位置即可。

【讨论】:

以上是关于JBoss 中的基本 ear-package 部署的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jboss 7.1.1 中使用 liferay 6.1.2 中的 jboss 部署 structure.xml?

从另一个客户端访问部署在 JBoss 7.0.1 中的 ejb

记录JAVAWEB部署到JBOSS中遇到的问题

远程客户端访问部署在 JBOSS AS 中的 EJB 的 JNDI 循环(7.1.1 最终版)

JBoss AS7中进行项目部署

如何更新jboss EAP -6.2中的JSP / JS而无需重新启动或重新部署构建