JAX-RS REST在WildFly正常运行,Tomcat 8.5报404错误求助
我来帮你解决这个跨容器部署的问题——你的REST API在WildFly上正常运行,但Tomcat 8.5报404,核心原因是两个容器对Java EE API的支持差异:WildFly是完整的Java EE应用服务器,自带JAX-RS实现(RESTEasy);而Tomcat只是Servlet容器,没有内置JAX-RS,你之前用<scope>provided</scope>的依赖在Tomcat环境下根本不会被加载,导致JAX-RS资源无法被识别,自然返回404。
另外从你的Tomcat启动日志来看,日志里只记录了默认应用(docs、examples、host-manager等)的部署,没有你的应用部署记录,也请先确认你的WAR包已经正确部署到Tomcat的webapps目录,或者IDE的部署配置无误。
下面是具体的解决方案,兼顾WildFly、Tomcat 8.5和Heroku部署:
1. 调整JAX-RS依赖的作用域
把你添加的jaxrs-ri依赖的scope从provided改为compile,这样打包时会将Jersey的JAX-RS实现包含到WAR包中,Tomcat就能找到所需的类了:
<dependency> <groupId>org.glassfish.jersey.bundles</groupId> <artifactId>jaxrs-ri</artifactId> <version>2.29</version> <scope>compile</scope> </dependency>
2. 避免WildFly的类加载冲突
现在WAR包里包含了Jersey,但WildFly自带了RESTEasy,会出现类冲突。你需要在项目的WEB-INF目录下创建jboss-deployment-structure.xml文件,排除WildFly自带的JAX-RS模块:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name="jaxrs" /> </exclude-subsystems> <exclusions> <module name="javax.ws.rs.api" /> <module name="org.jboss.resteasy.resteasy-jaxrs" /> </exclusions> </deployment> </jboss-deployment-structure>
这样WildFly会使用你WAR包里的Jersey实现,而不是自带的RESTEasy,避免冲突。
3. 确保JAX-RS应用配置正确
Tomcat需要明确的JAX-RS入口配置,你可以通过两种方式实现:
方式一:使用@ApplicationPath注解
创建一个继承Application的类,用@ApplicationPath指定API的基础路径:
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/api") public class RestApplication extends Application { // 空类即可,会自动扫描当前包下的JAX-RS资源 }
方式二:在web.xml中配置Jersey Servlet
如果你的项目有web.xml,可以添加如下配置:
<servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>你的REST资源所在的包路径</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping>
4. 适配Heroku部署
Heroku的Java buildpack会自动识别WAR包,你只需要确保:
- 打包生成的WAR包包含所有必要的依赖(已经通过
compilescope实现) - 如果需要指定Java和Tomcat版本,可以在项目根目录创建
system.properties文件,添加:java.runtime.version=1.8 tomcat.version=8.5.41
完成这些配置后,你的应用应该能在WildFly、Tomcat 8.5和Heroku上正常运行了。
内容的提问来源于stack exchange,提问作者Pavel Petr

