Java 17迁移后启动Jetty Server遇ServletException问题求助
以下是可能导致该ServletContainer启动异常的常见问题:
版本兼容性适配不足
Jersey 2.27和Jetty 9.4.44均发布于Java 17正式推出前,对Java 17的模块系统(JPMS)及权限规则适配不完善。Java 17的模块隔离机制可能导致Jersey内部类无法被Jetty类加载器正常访问,触发ServletContainer初始化异常。模块系统配置缺失
若应用未添加module-info.java模块声明,或声明中未正确引入Jersey、Jetty相关模块,会违反Java 17的模块访问规则,导致ServletContainer实例化时出现类访问权限问题。ServletContainer重复注册
异常信息显示容器已处于STARTED状态却仍抛出异常,大概率是代码中存在重复注册ServletContainer的逻辑。检查是否多次执行了ServletContainer初始化、添加至Jetty ServletHandler的操作,引发启动冲突。Java 17权限限制触发报错
Java 17收紧了反射与内部API的访问权限,Jersey 2.27可能依赖Java 8中允许但Java 17中被限制的内部API。需添加JVM启动参数放宽权限,示例参数:--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED具体参数需根据实际报错的内部API调整。
依赖版本冲突
检查依赖树,确认Jersey与Jetty依赖的Servlet API版本是否一致。Jersey 2.27依赖Servlet 3.1,Jetty 9.4.44虽支持该版本,但需避免其他依赖引入更高/更低版本的Servlet API,引发类加载冲突。
内容的提问来源于stack exchange,提问作者user3591754

