在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. 验证最终步骤
- 执行
mvn clean install重新构建项目 - 执行
mvn liberty:run启动服务器 - 访问正确的端点URL(如果WAR包带版本号,需调整应用名称部分)
内容的提问来源于stack exchange,提问作者Ryan Salah
相关产品推荐
相关产品推荐

