我怎样才能让 Wildfly 以正确的顺序加载我的 EAR 部署?
How can I get Wildfly to load my EAR deployments in the correct order?
根据 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>
我希望部署顺序为:
webapp-one
webapp-two
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")
即使我们同时开始部署所有这些,按顺序初始化意味着部署中的各个组件将按顺序初始化,因此 webapp-two 中的 EJB 的 Servlet 等将不会启动,直到webapp-one 已经启动。
我们仍然并行解析部署和构建部署元数据,因为没有理由不这样做。
我在子部署中遇到了同样的问题。您可以在每个子部署中定义一个具有依赖关系的子部署部署顺序。你需要在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 部分找到了解决方案。在此文档部分中,有一个带有绿色复选标记的绿色框:
Portability
The Java EE specification says that portable applications should not rely on sub deployments having access to other sub deployments unless an explicit Class-Path entry is set in the MANIFEST.MF. So portable applications should always use Class-Path entry to explicitly state their dependencies.
根据 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>
我希望部署顺序为:
webapp-one
webapp-two
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")
即使我们同时开始部署所有这些,按顺序初始化意味着部署中的各个组件将按顺序初始化,因此 webapp-two 中的 EJB 的 Servlet 等将不会启动,直到webapp-one 已经启动。
我们仍然并行解析部署和构建部署元数据,因为没有理由不这样做。
我在子部署中遇到了同样的问题。您可以在每个子部署中定义一个具有依赖关系的子部署部署顺序。你需要在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 部分找到了解决方案。在此文档部分中,有一个带有绿色复选标记的绿色框:
Portability The Java EE specification says that portable applications should not rely on sub deployments having access to other sub deployments unless an explicit Class-Path entry is set in the MANIFEST.MF. So portable applications should always use Class-Path entry to explicitly state their dependencies.