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

2024-04-20

我正在开发一个使用 Maven 进行依赖/构建/任何其他操作(项目生命周期管理或其他)的项目,并且我正在使用 Eclipse 进行开发和测试。

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

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

<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

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

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

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

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

到底是怎么回事?

Update:

根据评论中的讨论,我添加了排除项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 测试用例并选择“调试为 Junit”) - 但这不会改变 Eclipse 行为 - 类路径中的一些 jar 已经移动了一点,但结果还是那样vertx-hazelcast和它的hazelcast-3.6.3.jar之前加载了依赖项hazelcast-3.8.jar.


注意这个答案是与OP讨论的总结

看起来像顶点淡褐色 https://github.com/vert-x3/vertx-hazelcast/blob/master/pom.xml声明编译和测试范围的依赖关系hazelcast。这些范围不具有传递性,因此我的理解是该版本将按设计包含在类路径中。 @Echnalb 使用排除的建议是受到推崇的 https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html#Dependency_Exclusions解决这个问题的方法。

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

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

It did https://github.com/hazelcast/hazelcast/blob/master/hazelcast-client/pom.xml包括这样的依赖:

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

我建议(ed) 添加排除项hazelcast-client这似乎已经解决了问题。


@Guss 评论

  • 在排除之前,运行dependency:tree, hazelcast-client 是 根本没有列出
  • 有趣的是dependency:tree不检测测试范围的依赖关系。有没有办法强制它切换范围?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eclipse 在启动配置中使用错误的 Maven 依赖项 的相关文章

随机推荐

  • 休眠条件查询选择更新顺序

    我有以下使用 Hibernate Criteria API 的代码 List
  • Postgres,不使用索引的简单查询

    PostgreSQL 9 5 0 我有一张桌子叫message attachments it has 1931964 rows 我在该表中搜索了一个键 那就是message id 我也总是包括deleted at是 NULL 语句 例如软删
  • 如何让这个数组+函数起作用?

    我的阵列需要帮助 我是 C Winforms 的新手 这是我的函数 数组所在的位置 我正在尝试将数组发布到 XML 文件上 Functions static void XML Array string Data Array String x
  • Haskell:hackage Control.Applicative 文章中应用函子法则的描述存在缺陷?:它说 Applicative 决定函子

    我想我发现了一个缺陷黑客文章Control Applicative http hackage haskell org package base 4 8 0 0 docs Control Applicative html 作为对应用函子定律的
  • 在shell脚本中将编码格式设置为java

    我有一个运行我的 Java 应用程序的 shell 脚本 现在我想使用 shell 脚本为我的 java 应用程序指定编码格式 UTF8 任何人都可以提供帮助 我使用的是 mac os Thanks Ganesh Try invoking
  • 使用 PHP 创建 .jpg 文件的下载链接

    我想这应该很容易 我有一个分页图像库 每个图像下方都有一个小链接 上面写着 下载 Comp 这应该允许人们快速将 jpg 文件 带有 PHP 生成的水印 下载到他们的计算机上 现在 我知道我可以直接链接到 jpg 文件 但这需要用户在新窗口
  • 了解 UNIX 命令 xargs

    我对此很困惑 需要一些澄清 示例1 pgrep string xargs ps 示例2 find xargs grep whatever 从示例 1 中 我推测是这样的 搜索作为正在运行的进程名称的一部分的 字符串 并将所有匹配的进程 ID
  • Java 中 & 和 && 有什么区别?

    我一直以为 Java中的运算符用于验证其两个布尔操作数是否为true 以及 运算符用于对两个整数类型进行按位运算 最近我才知道 运算符也可用于验证其布尔操作数是否为true 唯一的区别是即使 LHS 操作数为 false 它也会检查 RHS
  • 如何避免 Entity Framework Core 中的循环导航属性?

    我有一个这样的表架构 CREATE TABLE Categories Id INT IDENTITY 1 1 Name varchar 100 CONSTRAINT PK Category Id PRIMARY KEY Id CREATE
  • iOS 自定义 UITextField 与出口初始化

    I need UITextField几乎没有定制 我创建了新的自定义类 CustomTextField 在IB中我创建了outlet对于我的每一个习惯UITextField 我运行代码 但自定义不起作用 为了进行检查 我在初始化过程中设置了
  • 应该如何构建plot_surface的数组?

    我试图了解如何构建用于plot surface 在Axes3d中 的数组 我尝试构建一个简单的表面来操作这些数组的数据 In 106 x Out 106 array 0 0 0 1 0 0 In 107 y Out 107 array 0
  • VBA 自动化 - 预填充组合盒

    我正在尝试通过 VBA 将数据从 Excel 预填充到本地 Intranet 网站 我已经能够将大部分数据预填充到网站 但我正在努力处理这个组合日期框 请参阅 HTML 代码 div class form group row div
  • 在 switch/case 语句中使用列表中的值作为 case

    我有一个 ArrayList 其中包含以下字符串 name age gender salary 有没有办法可以将 ArrayList 中的值用作 case 表达式 显而易见的答案是否定的 因为 case 表达式必须是常量表达式 但是 我想知
  • 谷歌标签管理器中的自定义事件触发器

    每次我创建自定义触发事件时 它都不会触发 谁能请教一下可能是什么原因 我创建了 gacustomevent 自定义触发器并将其命名为 gaevent 但该事件没有被触发 我想使用数据层中的事件来捕获值 有关如何解决问题的任何建议 从你的问题
  • 如何使着色器淡入某种颜色?

    这是我当前使用的着色器 它通过缓慢降低不透明度来淡化对象 我想褪成紫色 如何才能做到这一点 着色器 frag uniform sampler2D texture uniform float opacity void main vec4 pi
  • 使用 MultiSelect 具有自定义弹出编辑器的 Kendo Grid - 无法获取模型中的选定项目

    所以标题几乎说明了一切 我正在尝试将新的 MultiSelect 小部件合并到网格的自定义弹出编辑器模板中 我正在使用数据属性初始化方法并从远程数据源读取下拉选项 这一切都工作正常 但我无法将所选项目的值放入模型中 当我保存行时 数据数组将
  • 在 Access 中设置子窗体的记录源

    Dim newRS newRS SELECT DISTINCT Grp ID Group Name Group NPI FROM GROUP Forms loclistingfrm LocationListSubFrm RecordSour
  • ESAPI getValidInput 方法的使用

    我无法使用下面的 of 方法ESAPI class java lang String getValidInput java lang String context java lang String input java lang Strin
  • 使用 Javascript 以编程方式制作 Wave

    这是我目前拥有的http jsfiddle net 6GEfr http jsfiddle net 6GEfr 这可行 但我希望它像波浪一样 它应该看起来像真正的波浪 而不是 V 形 你如何逐渐做到这一点 var height 0 setI
  • Eclipse 在启动配置中使用错误的 Maven 依赖项

    我正在开发一个使用 Maven 进行依赖 构建 任何其他操作 项目生命周期管理或其他 的项目 并且我正在使用 Eclipse 进行开发和测试 该项目使用 Vert x 最新 我尝试使用 Hazelcast 进行一些集群管理 但我遇到了 Ha