使用dropwizard + jersey client时如何避免依赖冲突
How to avoid dependency conflict when using dropwizard + jersey client
我编写了一个 DropWizard REST API 并且可以使用。其中一个资源端点实际上写了一封电子邮件,但是一旦我添加以下依赖项,DropWizard 就开始在启动时失败
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.18.1</version>
</dependency>
DropWizard 依赖项是:
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-core</artifactId>
<version>0.8.1</version>
</dependency>
启动报错真长,总结如下
WARN [2015-05-01 20:06:08,887] org.glassfish.jersey.internal.Errors: The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 2
java.lang.NullPointerException
at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.setConfiguration(AbstractJAXBProvider.java:113)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
....
MultiException stack 2 of 2
java.lang.IllegalStateException: Unable to perform operation: method inject on com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:395)
....
MultiException stack 3 of 3
java.lang.IllegalStateException: Unable to perform operation: create on org.glassfish.jersey.message.internal.MessageBodyFactory
...
我猜 DropWizard 正在使用另一个相互冲突的依赖项,我该如何处理?
提前致谢
Dropwizard 0.8.x 使用 Jersey 2.x,这自然会与您的 Jersey 1.x 依赖项发生冲突。
我认为 jersey-client
可能没问题,只要你没有 dropwizard-client
依赖性,但 jersey-core
会在很多方面与 dropwizard 的球衣发生冲突,我没有认为你可以修复。而且我认为您无论如何都不需要 jersey-core
来发送电子邮件。
如果您为此确实需要球衣,请尝试使用 Jersey 2.16 而不是 dropwizard 正在使用的版本。
我有同样的问题(我使用的是 DW 0.9.2 并且对 DW 0.7.2 和 Jersey 有不需要的传递依赖性 1.x)
解决方案非常简单:在为您带来这两个库系列的依赖项中,声明一个 exclusion
它应该可以工作,例如,这就是我在 Gradle 中的做法:
compile("com.example.culprit:culprit:1.2.3") {
exclude group: 'io.dropwizard'
exclude group: 'com.sun.jersey'
}
Maven 的语法非常相似(实际上更冗长 ;-))
希望这对某人有所帮助。
我编写了一个 DropWizard REST API 并且可以使用。其中一个资源端点实际上写了一封电子邮件,但是一旦我添加以下依赖项,DropWizard 就开始在启动时失败
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.18.1</version>
</dependency>
DropWizard 依赖项是:
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-core</artifactId>
<version>0.8.1</version>
</dependency>
启动报错真长,总结如下
WARN [2015-05-01 20:06:08,887] org.glassfish.jersey.internal.Errors: The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 2
java.lang.NullPointerException
at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.setConfiguration(AbstractJAXBProvider.java:113)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
....
MultiException stack 2 of 2
java.lang.IllegalStateException: Unable to perform operation: method inject on com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:395)
....
MultiException stack 3 of 3
java.lang.IllegalStateException: Unable to perform operation: create on org.glassfish.jersey.message.internal.MessageBodyFactory
...
我猜 DropWizard 正在使用另一个相互冲突的依赖项,我该如何处理?
提前致谢
Dropwizard 0.8.x 使用 Jersey 2.x,这自然会与您的 Jersey 1.x 依赖项发生冲突。
我认为 jersey-client
可能没问题,只要你没有 dropwizard-client
依赖性,但 jersey-core
会在很多方面与 dropwizard 的球衣发生冲突,我没有认为你可以修复。而且我认为您无论如何都不需要 jersey-core
来发送电子邮件。
如果您为此确实需要球衣,请尝试使用 Jersey 2.16 而不是 dropwizard 正在使用的版本。
我有同样的问题(我使用的是 DW 0.9.2 并且对 DW 0.7.2 和 Jersey 有不需要的传递依赖性 1.x)
解决方案非常简单:在为您带来这两个库系列的依赖项中,声明一个 exclusion
它应该可以工作,例如,这就是我在 Gradle 中的做法:
compile("com.example.culprit:culprit:1.2.3") {
exclude group: 'io.dropwizard'
exclude group: 'com.sun.jersey'
}
Maven 的语法非常相似(实际上更冗长 ;-))
希望这对某人有所帮助。