java - Maven 在远程存储库的特定版本中找到具有传递依赖性的依赖项

标签 java maven dependencies repository convergence

编辑:“反向依赖分析”本来是我搜索的关键字 - 不幸的是我无法正确描述我的问题(也许这与这不是一个标准的事情有关 - 我实际上什至没有一个真正的用例)。

假设我有一个典型的收敛问题并且 dependency:tree 告诉我这样的事情:

[信息] com.my.group:myProject:jar:1.0.1 [信息] +- org.not.my.group:a-direct-dependency:jar:1.1:compile [信息] |\- org.not.my.group:transitive-dependency-A:jar:1.14.0:compile [信息]\- org.not.my.group:another-direct-dependency:jar:1.1:compile [INFO]\- (org.not.my.group:transitive-dependency-A:jar:1.18.0:compile - 因与 1.14.0 冲突而省略)

有没有一种方法可以分析一个中央存储库(也可以使用 nexus webgui)来找出是否有一个(更新的)版本的 org.not.my.group:a-direct-dependency:jar 依赖于传递依赖 org.not.my.group:transitive-dependency-A:jar 但版本是 1.18.0 而不是 1.14.0?

或者通常会问:我能否通过中央存储库(或任何远程存储库)找出谁依赖 Artifact ,就像我在本地使用它时一样?:

mvn dependency:tree -Dincludes=org.not.my.group:transitive-dependency-A:jar:1.18.0 -Dverbose

进一步说明:在上述(虚构的)场景中,我将使用三个“级别”的解决方案来解决收敛问题,而第一个将尽可能作为选择,而最新的是“肮脏的”更正”。

1 - Allign versions:如果我的依赖项——自己的或第三方的——直接的或可传递的——确实依赖于相同的 Artifact X但定义不同的版本我最好尝试找到较新版本的 X 或树中对 X 的依赖项,该依赖项与其余依赖项具有通用版本。这样我假设 X 的“适当升级”,因为他们可能需要应用代码更改。

2 - 排除依赖项: 如果我找不到这样的 Artifact ,我将成功地尝试排除较低版本,希望具有此排除项的依赖项可以处理较新的版本。这需要大量测试,因为我不能保证更新版本正确指向该版本 - 我基本上告诉 Maven“这个依赖项也将与版本的另一个依赖项一起工作,即使因此我不知道这个依赖项的内部设计"- 即使编译有效,我仍可能遇到运行时问题。

3 - 使用 dependencyManagement: 因为使用 dependencyManagement 会导致“屏蔽”(隐藏/不通过)强制执行器插件的某些收敛问题,我实际上不再认为这是一个解决方案(对于我的设置) ....说我遇到了一个收敛问题并使用 dependencyManagement 解决了它 - 后来 - 传递依赖项之一发生变化并导致类似的收敛问题,强制执行者插件无法再检测到。

旁注:我希望我的英语会更好,这样我就可以更轻松地描述这些特定主题……最终让你们更容易理解我。感谢我已经收到的意见 :)

最佳答案

首先如前所述定义那些直接使用的依赖,而不是依赖传递依赖。

此外,我会使用 maven-enforcer-plugin以防止这种情况。

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.4</version>
        <executions>
          <execution>
            <id>enforce</id>
            <configuration>
              <rules>
                <dependencyConvergence/>
              </rules>
            </configuration>
            <goals>
              <goal>enforce</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

关于java - Maven 在远程存储库的特定版本中找到具有传递依赖性的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28580250/

相关文章:

java - Junit 不支持 major.minor 版本 51.0,但不支持 Web 应用程序

java - 用以特定字母开头的单词制作ArrayList?

java - 如何从 Gradle 中的构建脚本依赖项导入类

java.lang.OutOfMemoryError : GC overhead limit exceeded excel reader 错误

用于在数组中打印元音的 Java 程序?

java - 具有失败的配置:@BeforeClass setUp和失败的配置:@AfterClass tearDown java.lang.NullPointerException错误

java - 从多模块项目创建 uber-jar

gradle - 在 compile 中排除类依赖,但在 testCompile 中包含 gradle

java - Maven 忽略为 javax.mail 提供的范围

.net - Visual Studio 中的 HintPath 与 ReferencePath