【问题标题】:How can I get Wildfly to load my EAR deployments in the correct order?如何让 Wildfly 以正确的顺序加载我的 EAR 部署?
【发布时间】:2015-09-04 16:30:31
【问题描述】:

根据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

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

【问题讨论】:

    标签: java wildfly


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,斯图尔特。因此,如果我理解正确,“正在启动子部署”消息不一定与正在启动的部署中的组件相对应?
    • 有没有办法通过依赖来定义初始化顺序而不是使用初始化顺序?如果这是唯一的机制,我们就会错过一些并行化。
    【解决方案2】:

    我在子部署中遇到了同样的问题。您可以在每个子部署中定义具有依赖关系的子部署部署顺序。您需要在 webapp-two-1.0-SNAPSHOT.war 的MANIFEST.MF 文件中添加Class-Path: webapp-one-1.0-SNAPSHOT.war。如果您使用 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 文档的 Class Loading in Wildfly 部分找到了解决方案。在这个文档部分是一个带有绿色复选标记的绿色框:

    便携性 Java EE 规范指出,可移植应用程序不应依赖于可以访问其他子部署的子部署,除非在 MANIFEST.MF 中设置了明确的 Class-Path 条目。因此可移植应用程序应该始终使用 Class-Path 条目来显式声明它们的依赖关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-12
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 2018-07-26
      相关资源
      最近更新 更多