测试中的 JettyReactiveClient NoClassDefFoundError

JettyReactiveClient NoClassDefFoundError in tests

为了增强 WebClient 中的日志记录便利性,我们添加了 jetty 反应式客户端:

  public Service () {
        SslContextFactory.Client sslContextFactory = new SslContextFactory.Client();
        HttpClient httpClient = new HttpClient(sslContextFactory) {
            @Override
            public Request newRequest(URI uri) {
                Request request = super.newRequest(uri);
                return enhance(request);
            }

        };

        this.webClient = WebClient.create().mutate()
                .clientConnector(new JettyClientHttpConnector(httpClient))
                .build();
    }


+--- org.eclipse.jetty:jetty-reactive-httpclient:3.0.4
|    +--- org.reactivestreams:reactive-streams:1.0.3
|    +--- org.eclipse.jetty:jetty-client:11.0.6 -> 9.4.44.v20210927
|    |    +--- org.eclipse.jetty:jetty-http:9.4.44.v20210927
|    |    |    +--- org.eclipse.jetty:jetty-util:9.4.44.v20210927
|    |    |    \--- org.eclipse.jetty:jetty-io:9.4.44.v20210927
|    |    |         \--- org.eclipse.jetty:jetty-util:9.4.44.v20210927
|    |    \--- org.eclipse.jetty:jetty-io:9.4.44.v20210927 (*)
|    \--- org.slf4j:slf4j-api:2.0.0-alpha1 -> 1.7.32

..上面的jetty依赖关系树显示了所有相关的jar。构建包含组的 'implementation' 和 'test-Implementation':'org.eclipse.jetty',名称:'jetty-reactive-client',版本:“3.0.4”。它工作正常,但使用 ok-http 进行测试时出现 :

org/eclipse/jetty/client/api/Request$Content
java.lang.NoClassDefFoundError: org/eclipse/jetty/client/ap/Request$Content

测试:

    @SpringBootTest(classes = Service.class)
    @ActiveProfiles(profiles = {"test", "local"})
    class ServiceTest {
        @Autowired
        private Service service;
        @MockBean
        private LogHelper logHelper;
    
    
        private static MockWebServer mockBackEnd;
        private static ObjectMapper objectMapper;
}

(为简洁起见省略测试。) 有什么建议吗?

+--- org.eclipse.jetty:jetty-reactive-httpclient:3.0.4
|    +--- org.reactivestreams:reactive-streams:1.0.3
|    +--- org.eclipse.jetty:jetty-client:11.0.6 -> 9.4.44.v20210927

您指定了 jetty-reactive-httpclient 版本 3.0.4

这需要 Jetty 11 的特定行为。 你不能像那样任意降级Jetty。

如 jetty-reactive-httpclient 的 README 中所述...

https://github.com/jetty-project/jetty-reactive-httpclient/blob/1.1.x/README.md

Reactive Client Versions Java Min Version Jetty Min Version
1.1.x Java 8 Jetty 9.4.x
2.0.x Java 11 Jetty 10.0.x
3.0.x Java 11 Jetty 11.0.x

如果您出于某种原因必须坚持使用 Jetty 9,那么您应该坚持使用版本范围 1 中的 jetty-reactive-httpclient。1.x