JBoss中的基本ear-package部署

时间:2015-10-26 14:26:05

标签: java deployment jboss ear maven-ear-plugin

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

  • 1 ear-package:all.ear
  • 耳包含有两个战争(A.war,耳朵中的B.war)
  • 耳包含有1个自制的罐子C和许多第三方罐子(在APP-INF \ lib下)

此软件包需要部署在JBoss WildFly 8.2.1

我正在使用maven的耳塞(maven-ear-plugin,版本2.10.1)。我在pom中的配置看起来像这样(这是'parent'项目,它结合了其他三个项目):

<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"

当我将每个库放在root下(不要使用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设置?...?)

2 个答案:

答案 0 :(得分:1)

错误“ WFLYEE0097:模块可能不是子级的解决方案 EAR的库目录”:如果项目是Maven,则在父pom.xml中删除或注释includeLibInApplicationXml true / includeLibInApplicationXml,主要目的是在application.xml中不包含jar或wars

答案 1 :(得分:0)

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

但我认为你想要做的是从WARs访问你在C.jar中声明的那些ejb。同样,根据规格,任何其他模块都可以看到坐在耳朵里的任何ejb-jar:

  

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

所以,只需将C.jar放在lib目录中的任何其他地方,你就可以了。