使用WireMock做集成测试报错找不到ALPN Processors如何解决?
问题解决方案
核心原因是spring-cloud-contract-wiremock 默认内置了shade重命名后的Jetty组件,报错日志中的wiremock.org.eclipse.jetty前缀也可以验证这一点:你单独引入的未重命名的jetty-alpn-server依赖类路径是org.eclipse.jetty.*,和WireMock内部使用的Jetty完全不互通,所以添加后不会生效。
JDK11已经内置ALPN支持,你不需要引入alpn-boot扩展,按以下方案处理即可:
- 方案一(优先推荐,无侵入):禁用WireMock的HTTP/2能力,如果你的测试不需要用到HTTPS、HTTP/2的打桩场景,直接修改WireMock的自动配置注解即可绕过ALPN组件加载:
把@AutoConfigureWireMock修改为:
不需要修改任何依赖,即可快速解决问题。@AutoConfigureWireMock(httpsPort = -1, properties = ["wiremock.http2.enabled=false"]) - 方案二(需要适配版本):引入对应版本的WireMock standalone包,删除你之前添加的
jetty-alpn-server依赖,新增和当前Spring Cloud Contract依赖的WireMock版本对齐的standalone包:
standalone包已经内置了所有需要的ALPN适配组件,会自动覆盖spring-cloud-contract-wiremock的默认依赖,解决类缺失问题。testImplementation("com.github.tomakehurst:wiremock-jre8-standalone:<你的WireMock版本号>") - 方案三(适配自定义Jetty场景):如果你的项目本身就依赖Jetty作为服务容器,你可以排除spring-cloud-contract-wiremock内置的shade版WireMock,单独引入非shade版的WireMock和版本对齐的Jetty全家桶组件,保证所有Jetty相关依赖版本完全一致即可。
另外需要验证CI环境的JDK发行版:本地运行正常CI失败很可能是CI使用了精简版OpenJDK,移除了内置的ALPN实现,建议将CI环境的JDK替换为Eclipse Temurin、Oracle JDK等标准JDK11发行版。
内容的提问来源于stack exchange,提问作者Kaj Nelissen
相关产品推荐
相关产品推荐

