如果传递冲突,是否可以在调解期间将 Maven 依赖项标记为 "lower priority"?

Is it possible to mark a Maven dependency as "lower priority" during mediation if it conflicts transitively?

我正在创建一个测试助手库,它使用来自其他几个项目的固定装置。其中一些项目实际上可能会使用这个测试助手作为他们自己测试的一部分。这似乎是循环的,但事实证明不是由于多模块设置;只有主服务模块的测试会使用测试帮助程序库,而客户端、仿真器和夹具模块仍然没有该依赖项:

- project foo
  - foo-service
    -> test-helper-lib (in <scope>test</scope> only)
  - foo-client
  - foo-emulator
  - foo-fixture
- project bar
  - bar-service
  - bar-client
  - bar-emulator
  - bar-fixture
- project test-helper-lib
  - test-helper-lib
    -> foo-client
    -> foo-fixture
    -> bar-client
    -> bar-fixture

现在,更准确地说,每个服务的测试确实将其客户端、模拟器和固定装置添加为依赖项。所以更像是:

- project foo
  - foo-service
    -> test-helper-lib (in <scope>test</scope> only)
    -> foo-client
    -> foo-emulator
    -> foo-fixture
  - foo-client
  - foo-emulator
  - foo-fixture
- project bar
  - bar-service
    -> bar-client
    -> bar-emulator
    -> bar-fixture
  - bar-client
  - bar-emulator
  - bar-fixture
- project test-helper-lib
  - test-helper-lib
    -> foo-client
    -> foo-fixture
    -> bar-client
    -> bar-fixture

您可以看到,在...之间可能存在传递依赖冲突

- foo-service
  - test-helper-lib
    - foo-client

- foo-service
  - foo-client

在这种情况下,在 foo-service 中,我总是希望排除 test-helper-lib 的 foo-{client,emulator,fixture} 版本,因为我希望 foo-service 测试使用最新的客户端、模拟器和夹具,而不是与 test-lib-helper 一起打包的旧版本。 我可以对 "mark" test-helper-lib 做一些事情,因为它具有较低优先级的传递依赖项吗?

首先,我想您在设置中并没有真正遇到您描述的问题。 Maven 有一个 "nearest dependency wins" 规则。由于您的 test-helper-lib 依赖项似乎比其他依赖项嵌套得更多,因此它们会松动。

不过,总的来说,我不太喜欢 Maven 依赖调解。一旦您的依赖树变得拥挤,就很难找出实际 "win" 的版本。我建议大量使用 <dependencyManagement>,它允许您控制传递依赖项的版本(无需实际向依赖项树添加您可能不需要的内容)。

对于你的具体问题:不,你不能给予版本号更多或更少的优先权。