Swagger HK2服务具体化失败问题求助(Swagger+Spring Boot Jersey+Java9)
解决Java 9 + Spring Boot Jersey + Swagger的HK2服务实例化警告问题
我之前也碰到过一模一样的情况——Swagger UI能正常用,但日志里的HK2警告看着特别闹心,给你几个亲测有效的解决思路:
1. 先解决Java 9模块系统的反射限制
Java 9的模块化机制会限制HK2的反射调用,这是最常见的触发原因。你可以在启动时添加以下JVM参数:
--add-modules java.xml.bind,java.activation --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED
如果是用Maven打包启动,直接在spring-boot-maven-plugin里配置:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments> --add-modules java.xml.bind,java.activation --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED </jvmArguments> </configuration> </plugin>
2. 调整版本到更兼容的组合
你当前用的Swagger 1.5.18和Spring Boot 2.0.1对Java 9的支持都不算完善,试试升级到以下版本:
- Spring Boot:
2.1.17.RELEASE(2.1.x分支的最后一个稳定版,对Java 9兼容性优化较多) - Swagger:
1.5.24(1.5.x分支的最终版本,修复了不少Java 9相关的适配问题) - Jersey starter会跟着Spring Boot版本自动适配,不用单独修改版本
3. 修正Jersey配置类的HK2注册
有时候Swagger的资源注册不完整,导致HK2无法找到对应的服务实现。在你的JerseyConfig里补充以下配置:
@Configuration public class JerseyConfig extends ResourceConfig { public JerseyConfig() { // 注册Swagger核心资源 register(ApiListingResource.class); register(SwaggerSerializers.class); // 手动扫描HK2和Swagger的相关包 packages("io.swagger.jaxrs.listing", "org.glassfish.hk2.utilities"); // 绑定HK2必要的服务类 register(new AbstractBinder() { @Override protected void configure() { bind(DefaultClassAnalyzer.class).to(ClassAnalyzer.class); } }); } }
4. 排除冲突的HK2依赖
如果Spring Boot自带的HK2版本和Swagger依赖的版本冲突,也会触发这个警告。在pom.xml里排除旧版本HK2,引入兼容Java 9的版本:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jersey</artifactId> <exclusions> <exclusion> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-api</artifactId> </exclusion> <exclusion> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-locator</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入兼容Java 9的HK2版本 --> <dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-api</artifactId> <version>2.6.1</version> </dependency> <dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-locator</artifactId> <version>2.6.1</version> </dependency>
建议按顺序尝试这些方法,一般第一个JVM参数就能解决问题,如果不行再试版本调整。
内容的提问来源于stack exchange,提问作者era
相关产品推荐
相关产品推荐

