【问题标题】:Eclipse uses wrong maven dependency in launch configurationEclipse 在启动配置中使用了错误的 Maven 依赖项
【发布时间】:2018-07-10 19:47:33
【问题描述】:

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

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

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

<dependency>
    <groupId>com.hazelcast</groupId>
    <artifactId>hazelcast</artifactId>
    <version>[3.7,)</version>
</dependency>

而且 maven 确实更新了依赖项(实际上 Eclipse 调用 maven 会在我保存 pom.xml 文件后立即更新 - 非常简洁),所以我得到了依赖项树:

$ 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。

问题是,如果我创建一个 Eclipse 启动配置来运行项目或其单元测试,它会将 Hazelcast 的旧版本和 Hazelcase 的新版本都插入到类路径中 - 这是一个示例命令行正在运行单元测试:

/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

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

启动配置“类路径”选项卡看起来很标准:

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

“项目资源管理器”视图中的“Maven 依赖项”“文件夹”仅显示较新的 Hazelcast 版本。

发生了什么事?

更新:

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

<dependency>
    <groupId>some.private</groupId>
    <artifactId>dependency</artifactId>
    <version>[1.3,)</version>
    <exclusions>
        <exclusion>
            <groupId>io.vertx</groupId>
            <artifactId>vertx-hazelcast</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-core</artifactId>
    <version>[3.0.0,)</version>
</dependency>
<dependency>
    <groupId>com.hazelcast</groupId>
    <artifactId>hazelcast</artifactId>
    <version>[3.7,)</version>
</dependency>
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-hazelcast</artifactId>
    <version>[3.0.0,)</version>
    <exclusions>
        <exclusion>
            <groupId>com.hazelcast</groupId>
            <artifactId>hazelcast</artifactId>
        </exclusion>
    </exclusions>
</dependency>

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

【问题讨论】:

  • 如果您从光盘$HOME/.m2/repository/com/hazelcast/hazelcast/3.6.3* 中删除缓存版本会怎样?
  • @Nic - 这不是我遇到问题的 jar,如果我删除它,那么启动将无法对所需的类进行精细处理,但如果我从 .m2 中删除 hazelcast-3.6.3.jar repo,然后启动继续并使用正确的 jar 文件(大概这是 JVM 的一个功能,它忽略了类路径上丢失的文件)。但是每当我运行 maven(无论是手动运行还是由 Eclipse 自动运行)时,旧的 jar 都会再次下载,我又回到了原点——所以我认为这不是一个解决方案。
  • 尝试在你的 pom.xml 中在旧依赖之前声明新的,也许...
  • @Ehcnalb - 我没有在我的 pom.xml 文件中声明旧依赖项 - 它来自 Vert.x pom.xml 文件。如果我可以删除它,我会的。
  • 好吧,在 Vert.x 之前声明 hazelcast (3.8),并尝试添加排除项

标签: java eclipse maven dependencies


【解决方案1】:

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

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

由于这不起作用,它可能是一个祖先也声明了一个也需要被排除的依赖项。

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

did 包含这样一个依赖:

<dependency>
    <groupId>com.hazelcast</groupId>
    <artifactId>hazelcast</artifactId>
    <scope>test</scope>
    <version>${project.parent.version}</version>
    <classifier>tests</classifier>
</dependency>

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


@Guss cmets

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2012-11-18
    • 2011-01-03
    相关资源
    最近更新 更多