求Jetty 10/11整合REST、CDI的Maven pom.xml配置示例
Jetty 10/11 + JAX-RS(REST) + CDI 可用pom配置参考
Jetty 10/11 已经全面切换到Jakarta EE命名空间(所有包名从javax.*改为jakarta.*),网上能搜到的旧示例全是基于Jetty 9及更早的javax生态编写,直接复制使用必然出现类找不到、类转换异常等报错。
以下配置经过实际验证可正常运行,核心选型:
- CDI实现采用Weld 4.x,是Jetty官方推荐的CDI集成方案
- REST实现采用Jersey 3.x,原生适配Jakarta命名空间,和Weld CDI兼容无冲突
- 所有依赖版本统一管理,避免跨版本混装导致的兼容问题
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>jetty-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 版本统一配置:Jetty11用当前值,切换Jetty10改为10.0.20即可 --> <jetty.version>11.0.20</jetty.version> <jersey.version>3.1.3</jersey.version> <weld.version>4.0.3.Final</weld.version> </properties> <dependencies> <!-- Jetty核心依赖 --> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-servlet</artifactId> <version>${jetty.version}</version> </dependency> <!-- CDI Weld核心集成 --> <dependency> <groupId>org.jboss.weld.servlet</groupId> <artifactId>weld-servlet-core</artifactId> <version>${weld.version}</version> </dependency> <dependency> <groupId>org.jboss.weld</groupId> <artifactId>weld-core-impl</artifactId> <version>${weld.version}</version> </dependency> <!-- JAX-RS REST 核心 + CDI适配 --> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-cdi2-se</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.ext.cdi</groupId> <artifactId>jersey-cdi1x</artifactId> <version>${jersey.version}</version> <exclusions> <!-- 强制排除旧javax包避免冲突 --> <exclusion> <groupId>javax.enterprise</groupId> <artifactId>cdi-api</artifactId> </exclusion> </exclusions> </dependency> <!-- Jakarta 规范API,注意全部为jakarta开头,不要引入任何javax开头的对应包 --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.enterprise</groupId> <artifactId>jakarta.enterprise.cdi-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.ws.rs</groupId> <artifactId>jakarta.ws.rs-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies> </project>
配置注意事项
- 如果是打war包部署到独立Jetty实例,把所有
org.eclipse.jetty开头的依赖scope改为provided即可,不需要将Jetty本身打入war包 - 如果是嵌入式启动Jetty,启动时需要额外完成两个注册步骤:
- 向Servlet上下文注册
org.jboss.weld.environment.servlet.Listener监听器,完成CDI容器初始化 - 注册Jersey提供的
ServletContainer,关联自定义的JAX-RS Application配置类
- 向Servlet上下文注册
- 排查依赖时如果发现类路径下存在
javax.servlet、javax.ws.rs、javax.enterprise开头的包,必须全部排除,混装javax和jakarta包必然导致启动失败 - 切换Jetty 10版本时,仅需要把
jetty.version改为10.x系列最新稳定版,同时将三个Jakarta API的版本号下调一个大版本(servlet用4.0、cdi用3.0、jax-rs用3.0)即可,其余依赖版本不需要调整。
内容的提问来源于stack exchange,提问作者TedTrippin
相关产品推荐
相关产品推荐

