Eclipse在启动配置中使用错误的maven依赖项

我正在开发一个项目,使用Maven进行依赖/构建/任何事情(项目生命周期管理或某事),我正在使用Eclipse进行开发和测试。

该项目使用Vert.x(最新),我正在尝试使用Hazelcast进行一些集群管理,但我遇到了一个错误,其中的Hazelcast版本Vert.x声明为依赖(3.6.3),解决方案显然是升级到更新版本。

我已经在我的pom.xml添加了更新的Hazelcast依赖项:

  com.hazelcast hazelcast [3.7,)  

并且maven确实更新了依赖项(实际上Eclipse一旦我保存pom.xml文件就称为maven更新 – 非常整洁),所以我得到了依赖树:

 $ mvn dependency:tree [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building project 3.8.4 [INFO] ------------------------------------------------------------------------ [WARNING] The POM for jfree:jfreechart:jar:1.0.8 is missing, no dependency information available [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ project --- [INFO] my.group:project:jar:3.8.4 [INFO] +- some.private.dep ... [INFO] | +- org.junit:junit4-engine:jar:5.0.0-ALPHA:compile (version selected from constraint [4,)) [INFO] | | \- org.junit:junit-engine-api:jar:5.0.0-ALPHA:compile [INFO] | | +- org.junit:junit-commons:jar:5.0.0-ALPHA:compile [INFO] | | \- org.opentest4j:opentest4j:jar:1.0.0-ALPHA:compile [INFO] | +- io.vertx:vertx-hazelcast:jar:3.3.3:compile (version selected from constraint [3.0.0,)) [INFO] | \- io.vertx:vertx-web:jar:3.4.0.Beta1:compile (version selected from constraint [3.0.0,)) [INFO] | \- io.vertx:vertx-auth-common:jar:3.4.0.Beta1:compile [INFO] +- io.vertx:vertx-core:jar:3.4.0.Beta1:compile [INFO] | +- io.netty:netty-common:jar:4.1.8.Final:compile [INFO] | +- io.netty:netty-buffer:jar:4.1.8.Final:compile [INFO] | +- io.netty:netty-transport:jar:4.1.8.Final:compile [INFO] | +- io.netty:netty-handler:jar:4.1.8.Final:compile [INFO] | | \- io.netty:netty-codec:jar:4.1.8.Final:compile [INFO] | +- io.netty:netty-handler-proxy:jar:4.1.8.Final:compile [INFO] | | \- io.netty:netty-codec-socks:jar:4.1.8.Final:compile [INFO] | +- io.netty:netty-codec-http:jar:4.1.8.Final:compile [INFO] | +- io.netty:netty-codec-http2:jar:4.1.8.Final:compile [INFO] | +- io.netty:netty-resolver:jar:4.1.8.Final:compile [INFO] | \- io.netty:netty-resolver-dns:jar:4.1.8.Final:compile [INFO] | \- io.netty:netty-codec-dns:jar:4.1.8.Final:compile [INFO] +- junit:junit:jar:4.12:test ... [INFO] +- com.hazelcast:hazelcast:jar:3.8-EA:compile [INFO] \- org.slf4j:slf4j-jdk14:jar:1.7.22:compile [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.785 s [INFO] Finished at: 2017-02-06T09:52:46+02:00 [INFO] Final Memory: 25M/435M [INFO] ------------------------------------------------------------------------ 

当我运行mvn package来创建阴影Jar时,我得到了Hazelcast的正确版本。

问题是,如果我为运行项目或其unit testing创​​建Eclipse启动配置,它会将旧版本的Hazelcast以及新版本的Hazelcase插入到类路径中 – 这是来自unit testing的示例命令行跑:

 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:33123 -ea -Dfile.encoding=UTF-8 -classpath ...: $HOME/.m2/repository/io/vertx/vertx-hazelcast/3.3.3/vertx-hazelcast-3.3.3.jar: $HOME/.m2/repository/com/hazelcast/hazelcast/3.6.3/hazelcast-3.6.3.jar: ... $HOME/.m2/repository/com/hazelcast/hazelcast/3.8-EA/hazelcast-3.8-EA.jar: ... -version 3 -port 38387 -testLoaderClass org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader -loaderpluginname org.eclipse.jdt.junit4.runtime -classNames my.group.project.SomeTest 

现在因为两个版本都被加载到类路径中,第一个版本(较旧的)“获胜”并且我得到了错误而不是获得更新的固定版本。

启动配置“Classpath”选项卡看起来非常标准:

 + Bootstrap Entries \- JRE System Library + User Enties \- project \- Maven Dependencies 

“Project Explorer”视图中的“Maven Dependencies”“文件夹”仅显示较新的Hazelcast版本。

到底是怎么回事?

更新:

根据评论中的讨论,我在pom.xml文件中添加了排除项,以防止vertx-hazelcast添加旧的hazelcast依赖项。 因为vertx-hazelcast是从另一个(私有)依赖项加载的,所以新设置更复杂,看起来像这样:

  some.private dependency [1.3,)   io.vertx vertx-hazelcast     io.vertx vertx-core [3.0.0,)   com.hazelcast hazelcast [3.7,)   io.vertx vertx-hazelcast [3.0.0,)   com.hazelcast hazelcast    

然后我删除了旧的启动配置并重新创建它(通过右键单击JUnit测试用例并选择“Debug as Junit”) – 但这并没有改变Eclipse的行为 – 类路径中的一些jar已经移动了一下,但结果仍然是在hazelcast-3.8.jar之前加载了hazelcast-3.6.3.jar及其hazelcast-3.6.3.jar依赖hazelcast-3.8.jar

注意此答案是与OP讨论的摘要

看起来像vertex-hazelcast声明了hazelcast的编译和测试范围依赖。 这些范围不是传递性的,所以我的理解是这个版本将被设计包含在类路径中。 @Echnalb建议使用排除是解决此问题的推荐方法。

由于这没有奏效,它可能是一个祖先也宣布依赖,也需要排除。

在查看了在vertex-hazelcast中声明的其他依赖vertex-hazelcast ,我检查了hazelcast-client以查看它是否还声明了对早期版本的hazelcast的依赖关系,假设祖先依赖关系被添加到类路径中,尽管排除了父母。

它确实包括这样的依赖:

  com.hazelcast hazelcast test ${project.parent.version} tests  

我建议( ed )为hazelcast-client添加一个排除,这似乎解决了这个问题。


@Guss评论

  • 在排除之前,运行dependency:tree ,hazelcast-client根本没有列出
  • 有趣的是, dependency:tree不会检测测试范围的依赖项。 有没有办法强迫它切换范围?