Java 如何解决来自两个不同jar的相同类之间的冲突?
我正在将我的项目的jdk从8更新到11。所以,在跑步时,我面临着这样的警告Java 如何解决来自两个不同jar的相同类之间的冲突?,java,spring,maven,jar,dependencies,Java,Spring,Maven,Jar,Dependencies,我正在将我的项目的jdk从8更新到11。所以,在跑步时,我面临着这样的警告 org.aspectj.internal.lang.annotation.ajcDeclareAnnotation从多个位置扫描:jar:file:///Users/nishtha.garg/.m2/repository/org/aspectj/aspectjrt/1.9.2/aspectjrt-1.9.2.jar!/org/aspectj/internal/lang/annotation/ajcDeclareAnno
org.aspectj.internal.lang.annotation.ajcDeclareAnnotation从多个位置扫描:jar:file:///Users/nishtha.garg/.m2/repository/org/aspectj/aspectjrt/1.9.2/aspectjrt-1.9.2.jar!/org/aspectj/internal/lang/annotation/ajcDeclareAnnotation.class,jar:file:///Users/nishtha.garg/.m2/repository/org/aspectj/aspectjweaver/1.9.2/aspectjweaver-1.9.2.jar!/org/aspectj/internal/lang/annotation/ajcDeclareAnnotation.class
javax.mail.search.MessageIDTerm从多个位置扫描:jar:file:///Users/nishtha.garg/.m2/repository/javax/mail/mail/1.4/mail-1.4.jar!/javax/mail/search/MessageIDTerm.class,jar:file:///Users/nishtha.garg/.m2/repository/javax/mail/javax.mail-api/1.6.2/javax.mail-api-1.6.2.jar!/javax/mail/search/MessageIDTerm.class
org.aspectj.lang.reflect.declareprecess从多个位置扫描:jar:file:///private/var/folders/rw/9_fr4s6s01d5vcykl3fqkd7d3j59v0/T/jetty-0.0.0.0-0-attache-api-rest.war-_api-any-13258162480745251787.dir/webapp/WEB-INF/lib/aspectjrt-1.9.2.jar!/org/aspectj/lang/reflect/declareprecessence.class,jar:file:///private/var/folders/rw/9_fr4s6s01d5vcykl3fqkd7d3j59v0/T/jetty-0.0.0.0-0-attache-api-rest.war-_api-any-13258162480745251787.dir/webapp/WEB-INF/lib/aspectjweaver-1.9.2.jar!/org/aspectj/lang/reflect/declareprecessence.class
org.apache.cxf.transport.http.policy.HTTPClientAssertionBuilder$HTTPClientPolicyAssertion从多个位置扫描:jar:file:///private/var/folders/rw/9_fr4s6s01d5vcykl3fqkd7d3j59v0/T/jetty-0.0.0.0-0-attache-api-rest.war-_api-any-13258162480745251787.dir/webapp/WEB-INF/lib/cxf-rt-transports-http-3.1.12.jar!/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilder$HTTPClientPolicyAssertion.class,jar:file:///private/var/folders/rw/9_fr4s6s01d5vcykl3fqkd7d3j59v0/T/jetty-0.0.0.0-0-attache-api-rest.war-_api-any-13258162480745251787.dir/webapp/WEB-INF/lib/cxf-rt-transports-http-3.1.4.jar!/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilder$HTTPClientPolicyAssertion.class
让我们以其中一个冲突为例:
org.apache.cxf.transport.http.policy.HTTPClientAssertionBuilder$HTTPClientPolicyAssertion
从多个位置扫描:
罐子:file:///private/var/folders/rw/9_fr4s6s01d5vcykl3fqkd7d3j59v0/T/jetty-0.0.0.0-0-attache-api-rest.war-_api-any-13258162480745251787.dir/webapp/WEB-INF/lib/cxf-rt-transports-http-3.1.12.jar/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilder$HTTPClientPolicyAssertion.class
罐子:file:///private/var/folders/rw/9_fr4s6s01d5vcykl3fqkd7d3j59v0/T/jetty-0.0.0.0-0-attache-api-rest.war-_api-any-13258162480745251787.dir/webapp/WEB-INF/lib/cxf-rt-transports-http-3.1.4.jar/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilder$HTTPClientPolicyAssertion.class
深入挖掘(粗体)可以看到,所讨论的类是由不同版本的“cxf rt transports http”提供的,即3.1.4和3.1.12版本的单独JAR
您需要单独检查每个冲突,并从类路径中删除不太理想的jar
最好的方法是创建排除,例如:
<exclusions>
<exclusion> <!-- declare the exclusion here -->
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
</exclusion>
</exclusions>
org.apache.cxf
cxf rt传输http
您可以在依赖于上述内容的依赖项上声明它
这并不总是容易弄清楚的,除非你有一个软件可以演示依赖关系图。
例如,在Eclipse中,Maven POM编辑器可以为您显示依赖关系、冲突和生成排除
选择标准:
在大多数情况下,您可能希望获得最新版本,因此在本例中可能是3.1.12。
但是,您可能不想要最新的、最新的,而是一个经过广泛测试的特定稳定版本,但它不包含任何漏洞。因此,这个问题的答案并不直截了当
如果您需要一个特定的版本,最好在您自己的pom中声明对该工件的显式依赖,并将其从所有其他版本中排除
编辑:
您可能需要选择一个特定版本而不是另一个版本的另一个原因是,您可能正在使用另一个库,该库反过来依赖于冲突依赖项的特定版本,但与较新版本存在问题
在大多数情况下,版本编号是。
,并且在几乎所有情况下,bugfix版本都是二进制兼容的,因此在cxf rt传输http的情况下,您应该选择3.1.12
另一方面,假设依赖关系A取决于C v1.5.0,B取决于C v2.1.2。由于这些主要版本之间可能不兼容,这将更加困难。v2中可能有您需要的功能,但a不兼容,因为a依赖的重要方法已被删除
然后,您需要检查是否存在可与C v2.1.X一起使用的更新版本,并将其替换。如果没有,您可能需要降级B,或者将它们并排安装。在极端情况下,可能需要重新包装产品。
另一种方法是对项目进行贡献或分叉,以创建具有更新的依赖项的版本
也许思考一下这些警告的目的会有所帮助:
他们实际上是说您的代码可能会运行,但也有可能是以不确定的方式选择了依赖项版本,因此代码的某些操作可能与您期望的不一致。
您要做的是通过在每种情况下只向JVM提供一个选项来进行选择,从而使其具有确定性。作为开发人员,您可以有意识地选择使用或依赖哪个版本
如果你没有其他理由,那么我会选择最新的/最高的