Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决来自两个不同jar的相同类之间的冲突?_Java_Spring_Maven_Jar_Dependencies - Fatal编程技术网

Java 如何解决来自两个不同jar的相同类之间的冲突?

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

我正在将我的项目的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/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提供一个选项来进行选择,从而使其具有确定性。作为开发人员,您可以有意识地选择使用或依赖哪个版本

如果你没有其他理由,那么我会选择最新的/最高的