如何在WildFly的EAR中使用多个JAX-RS Jar包避免冲突?
解决EAR包中多JAX-RS项目的URL冲突问题
核心冲突原因
- 跨WAR访问同一端点:EJB模块作为EAR共享库,所有WAR的类加载器都会加载其中的JAX-RS资源,导致每个WAR的
Application实例都能扫描到所有项目的资源类,从而映射出重复端点。 - 同一WAR下同名端点冲突:未限制
Application的资源扫描范围时,不同项目的Application会加载所有JAX-RS资源,导致同一WAR下不同项目的同名@Path资源出现匹配冲突。
具体解决方案
1. 精准控制每个Application的资源扫描范围
默认情况下,继承Application的类会扫描整个类路径下的JAX-RS资源,必须手动指定每个项目的专属资源类,避免跨项目资源被加载。
projectone的配置修改
@ApplicationPath("/projectone/api/") public class ProjectOneRestApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<>(); // 仅添加projectone的JAX-RS资源类 classes.add(com.yourpackage.projectone.ZipResource.class); // 若有其他资源类,继续添加 return classes; } }
projecttwo的配置修改
@ApplicationPath("/projecttwo/api") public class ProjectTwoRestApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<>(); // 仅添加projecttwo的JAX-RS资源类 classes.add(com.yourpackage.projecttwo.ZipResource.class); return classes; } }
2. 隔离跨WAR的资源访问
方案A:拆分EJB模块(推荐)
将不同项目的服务端JAR拆分为独立的EJB模块,比如projectone-ejb.jar、projecttwo-ejb.jar,再通过WAR的部署描述文件指定专属依赖:
以WildFly/JBoss为例,在warone的WEB-INF/jboss-deployment-structure.xml中添加:
<jboss-deployment-structure> <deployment> <dependencies> <!-- 仅依赖projectone的EJB模块 --> <module name="deployment.MyExec.projectone-ejb" /> </dependencies> </deployment> </jboss-deployment-structure>
同理,wartwo只依赖projecttwo-ejb模块,确保每个WAR仅加载对应项目的资源。
方案B:关闭自动扫描+手动指定资源
如果不想拆分EJB模块,可在每个WAR的web.xml中关闭JAX-RS自动扫描:
<context-param> <param-name>resteasy.scan</param-name> <param-value>false</param-value> </context-param>
结合步骤1中手动指定资源类的方式,强制每个WAR仅加载自身项目的JAX-RS资源。
验证效果
完成配置后:
http://localhost:8180/MyExec/warone/projectone/api/zip?zip=12345678仅触发projectone的资源http://localhost:8180/MyExec/wartwo/projecttwo/api/zip?zip=12345678仅触发projecttwo的资源- 跨WAR访问无效,同一WAR下不同项目的同名端点不再冲突
内容的提问来源于stack exchange,提问作者Rhuan S. Hianc
相关产品推荐
相关产品推荐

