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

Maven find dependency having a transitive dependency in a specific version in a remote repository

编辑:"Reverse Dependency analysis" 本来是我搜索的关键字 - 不幸的是我无法正确描述我的问题(也许这与这不是一个标准的事情有关 - 我实际上不甚至有一个真正的用例)。

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

[INFO] com.my.group:myProject:jar:1.0.1 [INFO] +- org.not.my.group:a-direct-dependency:jar:1.1:compile [INFO] | \- org.not.my.group:transitive-dependency-A:jar:1.14.0:compile [INFO] \- org.not.my.group:another-direct-dependency:jar:1.1:compile [INFO] \- (org.not.my.group:transitive-dependency-A:jar:1.18.0:compile - omitted for conflict with 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 中?

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

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

进一步说明: 在上述(虚构的)场景中,我将使用三个 "levels" 解决方案来解决收敛问题,而第一个将尽可能成为选择最新的是 "a dirty correction"。

1 - Allign versions:如果我的依赖项——自己的或第三方的——直接的或传递的——确实依赖同一个工件X但是定义一个不同的版本我最好尝试找到 X 的更新版本或树中对 X 的依赖关系,它与其余的依赖项。这样我假设 "a proper upgrade" of X 因为他们可能需要应用代码更改。

2 - 排除依赖项: 如果我找不到这样的工件,我将成功地尝试排除较低版本,希望具有此排除项的依赖项可以处理较新的版本。这需要大量测试,因为我不能保证更新版本正确指向版本 - 我基本上告诉 Maven "this dependency will work with another dependency of version as well even thus i have no idear of the internal design of this dependency" - 即使编译工作我仍然可能遇到运行时问题。

3 - 使用 dependencyManagement: 因为使用 dependencyManagement 会导致 "mask" (hide/outpass) 强制插件的某些收敛问题我实际上不考虑这不再是一个解决方案(对于我的设置)....说我遇到了一个收敛问题并使用 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>

因为我的英语水平经常不够好 - "Reverse dependency analysis" 本来是让我自己清楚的术语 - 有一些插件可以将其存档,如此处所述 http://tech.finn.no/2013/01/31/i-wish-i-knew-my-consumers-maven-reverse-dependency/