Search code examples
javajettyspring-boot-test

JettyReactiveClient NoClassDefFoundError in tests


Having an enhancement for logging convinience in WebClient we've added jetty reactive client:

  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

..and jetty dependency tree above showes all related jars. Build contains both 'implementation' and 'test-Implementation' of group: 'org.eclipse.jetty', name: 'jetty-reactive-client', version: "3.0.4" . It works fine but test with ok-http falls with :

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

test :

    @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;
}

( ommiting tests for brievety.) Any suggestions?


Solution

  • +--- 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
    

    You have specified jetty-reactive-httpclient version 3.0.4

    That requires Jetty 11 specific behaviors. You cannot downgrade Jetty arbitrarily like that.

    As noted in the README for jetty-reactive-httpclient ...

    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

    If you have to stick with Jetty 9 for whatever reason, then you should stick with the jetty-reactive-httpclient in the version range 1.1.x