如何避免JBoss EAP端点URL中包含部署文件名
解决JBoss多WAR部署端点URL不含WAR文件名且避免冲突的方案
问题背景
在JBoss上部署多个独立WAR项目时,若不配置<context-root>,端点URL默认会包含WAR文件名;但所有WAR都配置<context-root>/</context-root>会触发上下文根重复异常,报错如下:
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配置根路径/,而是给每个项目分配唯一的子路径。例如:
项目A的jboss-web.xml:<context-root>/project-a</context-root>项目B的
jboss-web.xml:<context-root>/project-b</context-root>这样端点URL会变为
/project-a/xxx、/project-b/xxx,既去掉了WAR文件名,又不会出现上下文根冲突。使用虚拟主机区分项目
若需保持根路径访问,可通过虚拟主机绑定不同域名/子域名来隔离项目:- 在JBoss的
standalone.xml或domain.xml中配置虚拟主机:<subsystem xmlns="urn:jboss:domain:web:11.0" default-virtual-server="default-host" native="false"> <virtual-server name="project-a-host" enable-welcome-root="false"> <alias name="a.yourdomain.com"/> </virtual-server> <virtual-server name="project-b-host" enable-welcome-root="false"> <alias name="b.yourdomain.com"/> </virtual-server> </subsystem> - 在对应项目的
jboss-web.xml中绑定虚拟主机和根上下文:<context-root>/</context-root> <virtual-host>project-a-host</virtual-host>
访问时,
a.yourdomain.com/xxx对应项目A的服务,b.yourdomain.com/xxx对应项目B的服务,无冲突且URL简洁。- 在JBoss的
合并为EAR部署(业务允许时)
如果多个项目可以整合,打包成EAR文件,在application.xml中为每个WAR模块配置上下文根:<module> <web> <web-uri>project-a.war</web-uri> <context-root>/</context-root> </web> </module> <module> <web> <web-uri>project-b.war</web-uri> <context-root>/project-b</context-root> </web> </module>根据业务需求分配不同路径,避免根路径冲突。
内容的提问来源于stack exchange,提问作者HookUp
相关产品推荐
相关产品推荐

