如何让Wildfly以正确的顺序加载我的EAR部署?

时间:2015-09-04 16:30:32

标签: java wildfly

根据Wildfly's documentation,应该可以声明在EAR中部署子部署的顺序。但是,我无法让它尊重我在我的应用程序中定义的依赖关系的顺序。

EAR已指定initialize-in-order并且我已在JBoss特定文件中指定了webapp-three -> webapp-two -> webapp-one的依赖关系链。

我是否遗漏了有关如何宣布此事的内容?

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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6">
  <display-name>ear</display-name>
  <initialize-in-order>true</initialize-in-order>
  <module>
    <web>
      <web-uri>webapp-one-1.0-SNAPSHOT.war</web-uri>
      <context-root>/one</context-root>
    </web>
  </module>
  <module>
    <web>
      <web-uri>webapp-two-1.0-SNAPSHOT.war</web-uri>
      <context-root>/two</context-root>
    </web>
  </module>
  <module>
    <web>
      <web-uri>webapp-three-1.0-SNAPSHOT.war</web-uri>
      <context-root>/three</context-root>
    </web>
  </module>
</application>

jboss-deployment-structure.xml

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <sub-deployment name="webapp-one-1.0-SNAPSHOT.war">
    </sub-deployment>
    <sub-deployment name="webapp-two-1.0-SNAPSHOT.war">
        <dependencies>
            <module name="deployment.wildfly-deployment-order.ear.webapp-one-1.0-SNAPSHOT.war" />
        </dependencies>
    </sub-deployment>
    <sub-deployment name="webapp-three-1.0-SNAPSHOT.war">
        <dependencies>
            <module name="deployment.wildfly-deployment-order.ear.webapp-two-1.0-SNAPSHOT.war" />
        </dependencies>
    </sub-deployment>
</jboss-deployment-structure>

我希望部署顺序为:

  1. webapp-one
  2. webapp-two
  3. webapp-three
  4. 以下是Wildfly的部署方式:

    11:27:31,046 INFO MSC service thread 1-1 [deployment] JBAS015973: Starting subdeployment (runtime-name: "webapp-two-1.0-SNAPSHOT.war") 11:27:31,046 INFO MSC service thread 1-1 [deployment] JBAS015973: Starting subdeployment (runtime-name: "webapp-three-1.0-SNAPSHOT.war") 11:27:31,047 INFO MSC service thread 1-1 [deployment] JBAS015973: Starting subdeployment (runtime-name: "webapp-one-1.0-SNAPSHOT.war")

2 个答案:

答案 0 :(得分:3)

即使我们开始同时部署所有这些,但是按顺序初始化意味着部署中的各个组件将按顺序初始化,因此webapp-two中的EJB的Servlet等将不会启动,直到webapp-一个人已经开始了

我们仍然会解析部署并并行构建部署元数据,因为没有理由不这样做。

答案 1 :(得分:0)

我遇到了与子部署相同的问题。您可以在每个子部署中定义具有依赖关系的子部署部署顺序。您需要将Class-Path: webapp-one-1.0-SNAPSHOT.war添加到webapp-two-1.0-SNAPSHOT.war的MANIFEST.MF文件中。如果您使用maven,则可以使用maven-war-plugin文档中描述的配置。它将pom.xml中定义的依赖项条目放入Class-Path:部分,但如果依赖项定义为已提供,则不起作用。在这种情况下,请在pom.xml

中使用以下配置
 <archive>
   <manifestEntries>
     <Class-Path>webapp-one-1.0-SNAPSHOT.war</Class-Path>
   </manifestEntries>
 </archive>

我在问题中发布的Wildfly文档中的类加载Wildfly 部分找到了解决方案。在本文档部分是一个带有绿色复选标记的绿色框:

  

<强>可移植性   Java EE规范说,除非在MANIFEST.MF中设置了显式的Class-Path条目,否则便携式应用程序不应该依赖可以访问其他子部署的子部署。因此,可移植应用程序应始终使用Class-Path条目来显式声明其依赖项。