我们在 JBoss 服务器上部署了多个 war 文件,如果我没有在 jboss-web.xml 中设置以下属性,则默认情况下在端点 url 中包含 war 文件名:
<context-root>/</context-root>
但我无法对所有 war 文件执行此操作,因为它们都是不同的项目(每个项目都有自己的 jboss-web.xml)。如果我这样做,它会给出重复的异常..
JBWS022102: Cannot stop endpoint in state UNDEFINED: jboss.ws:context=*****
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-5) MSC000001: Failed to start service jboss.deployment.unit."*************-webservices-1_0.war".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."*************-webservices-1_0.war".INSTALL: WFLYSRV0153: Failed to process phase INSTALL of deployment "*************-webservices-1_0.war"
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:189)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1739)
这种情况下如何避免war文件名?
默认情况下,WildFly 使用部署的名称作为部署上下文名称。正如您所指出的,您可以使用
jboss-web.xml
来覆盖它。您无法使用相同的上下文部署多个应用程序,因此使用 <context-root>/</context-root>
不起作用。
每个部署都需要它自己的上下文名称。最好使用众所周知的名称。您可以使用
/api
、/webservices
、/web
等上下文。您还可以使用不带版本名称的项目名称。
您可以像这样进行硬编码:
<context-root>/webservices</context-root>
每次部署都有不同的
context-root
。这可以通过使用 Maven 过滤 jboss-web.xml
资源和如下条目来实现自动化:
<context-root>/${project.artifactId}</context-root>
另一种选择是在 POM 的
<finalName>
部分中使用 <build>
配置参数。
<build>
<finalName>${project.artifactId}</finalName>
....
</build>
最后一个选项是在部署时覆盖运行时名称。这取决于您如何部署应用程序。
使用 CLI:
/deployment=webservices:add(content=[{url=file:///path/to/webservies-1.0.war}], runtime-name=webservices.war)
/deployment=webservices:deploy
使用 WildFly Maven 插件:
<plugin>
<groupId>org.wildfly.plugins</groupId>
<artifactId>wildfly-maven-plugin</artifactId>
<version>${version.plugin.wildfly}</version>
<configuration>
<runtime-name>webservices.war</runtime-name>
</configuration>
</plugin>
如果您通过 Web 控制台进行部署,您应该会看到覆盖运行时名称的方法。