Если я создаю проект Java (Maven) (называемый com.example.lib) со следующим классом приложения
package com.example.lib;
import javax.json.JsonObject;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
public class App
{
public String getJson(String url) {
Client client = ClientBuilder.newClient();
Response response = client.target( url )
.request(MediaType.APPLICATION_JSON_TYPE)
.get();
if (response.getStatus() != 200) {
System.exit(1);
}
return response.readEntity( JsonObject.class ).toString();
}
public static void main( String[] args )
{
System.out.println(new App().getJson(args[0]));
}
}
и следующие зависимости в pom.xml
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.22.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-processing</artifactId>
<version>2.22.2</version>
</dependency>
Я могу вызвать метод getJson с помощью «http://api.plos.org/search?q=title:%22Drosophila%22%20and%20body:%22RNA%22&fl=id,abstract&wt=json&indent=on" (или любой конечной точки http, возвращающей JSON), и все работает как положено.
Такое поведение может быть продемонстрировано следующим образом
mvn clean package
java -jar target/my-lib-1.0-SNAPSHOT-run.jar "http://api.plos.org/search?q=title:%22Drosophila%22%20and%20body:%22RNA%22&fl=id,abstract&wt=json&indent=on"
Если я добавлю следующую зависимость
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.3</version>
</dependency>
и больше ничего не делать, тогда я получаю следующую ошибку при совершении вызова
Exception in thread "main" java.lang.NullPointerException
at org.apache.cxf.jaxrs.client.AbstractClient.setupOutInterceptorChain(AbstractClient.java:847)
at org.apache.cxf.jaxrs.client.AbstractClient.createMessage(AbstractClient.java:924)
at org.apache.cxf.jaxrs.client.WebClient.finalizeMessage(WebClient.java:1109)
at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1082)
at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:883)
at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:854)
at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:417)
at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1609)
at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1604)
at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.get(WebClient.java:1524)
at org.apache.cxf.jaxrs.client.spec.InvocationBuilderImpl.get(InvocationBuilderImpl.java:80)
at com.example.lib.App.getJson(App.java:21)
at com.example.lib.App.main(App.java:30)
Почему это происходит?
Как мне решить эту проблему?
Есть проект, демонстрирующий это на https://github.com/HughPowell/my-lib.
Примечание: это упрощенный случай того, что на самом деле происходит. Я полагаюсь на две библиотеки, каждая из которых, где-то в цепочке зависимостей, соответственно зависит от каждой из этих зависимостей.