You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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包包含所有必要的依赖(已经通过compile scope实现)
  • 如果需要指定Java和Tomcat版本,可以在项目根目录创建system.properties文件,添加:
    java.runtime.version=1.8
    tomcat.version=8.5.41
    

完成这些配置后,你的应用应该能在WildFly、Tomcat 8.5和Heroku上正常运行了。

内容的提问来源于stack exchange,提问作者Pavel Petr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:01:37