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

在Open Liberty上运行时出现JAX-RS资源找不到(404)问题

JAX-RS + Open Liberty 404错误排查与解决

问题背景

我正在开发一个使用JAX-RS创建RESTful Web服务并部署在Open Liberty上的Maven项目。尽管完成了应用配置,但访问REST端点时持续遇到404: SRVE0190E: 文件未找到错误。

项目结构如下:
项目结构

pom.xml 关键配置

<!-- JAX-RS API -->
<dependency>
    <groupId>jakarta.ws.rs</groupId>
    <artifactId>jakarta.ws.rs-api</artifactId>
    <version>2.1.6</version>
</dependency>
</dependencies>

<plugins>
    <plugin>
            <groupId>io.openliberty.tools</groupId>
            <artifactId>liberty-maven-plugin</artifactId>
            <version>3.10.3</version>
            <configuration>
                <serverName>guideServer</serverName>
            </configuration>
        </plugin>

        <plugin>    
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>11</source>
        <target>11</target>
    </configuration>
</plugin>

HelloWorld.java 代码

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class HelloWorld {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String greeting() {
        return "Hello World";
    }
}

MyApplication.java 代码

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/api")
public class MyApplication extends Application {
}

server.xml 配置

<featureManager>
    <feature>jaxrs-2.1</feature>
    <feature>servlet-4.0</feature>
</featureManager>

<application id="jaxrs-liberty" location="jaxrs-liberty.war" type="war"/>

构建与启动命令:

  • 构建:mvn clean package
  • 启动服务器:mvn liberty:run
  • 访问端点:http://localhost:9080/jaxrs-liberty/api/hello,返回404错误。

原因分析与解决方案

1. API包导入版本不兼容

引入的是Jakarta EE规范的jakarta.ws.rs-api依赖,但代码中使用了旧的javax.ws.rs包。Open Liberty的jaxrs-2.1特性对应Jakarta EE 8,必须使用jakarta.ws.rs开头的包路径,否则容器无法识别JAX-RS资源。

解决:
修改两个Java文件的导入语句:

// HelloWorld.java
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

// MyApplication.java
import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.core.Application;

2. JAX-RS API依赖未设置provided范围

Open Liberty内置了JAX-RS的实现(Apache CXF),不需要将API包打包到WAR中。如果不添加provided范围,会导致类冲突,阻止容器扫描并注册JAX-RS资源。

解决:
修改pom.xml中的JAX-RS依赖:

<dependency>
    <groupId>jakarta.ws.rs</groupId>
    <artifactId>jakarta.ws.rs-api</artifactId>
    <version>2.1.6</version>
    <scope>provided</scope>
</dependency>

3. 项目结构不规范

确保HelloWorld.java和MyApplication.java放在src/main/java下的具体包中(例如com.example.jaxrs),而非直接放在根目录。Open Liberty需要正确的包结构来扫描JAX-RS注解类。

4. server.xml应用部署路径不匹配

Maven构建生成的WAR包可能带有版本号(例如jaxrs-liberty-1.0-SNAPSHOT.war),但server.xml中指定的是jaxrs-liberty.war,导致容器找不到部署文件。

解决:

  • 方法1:修改server.xml中的location属性为实际WAR文件名:
<application id="jaxrs-liberty" location="jaxrs-liberty-1.0-SNAPSHOT.war" type="war"/>
  • 方法2:移除server.xml中的<application>配置,使用liberty:run插件自动部署构建的应用,避免路径不一致问题。

5. 验证最终步骤

  1. 执行mvn clean install重新构建项目
  2. 执行mvn liberty:run启动服务器
  3. 访问正确的端点URL(如果WAR包带版本号,需调整应用名称部分)

内容的提问来源于stack exchange,提问作者Ryan Salah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:54:51