如何在更新到 Maven 2.0.6 之前准备依赖项

如果您在 dependencyManagement 中有与传递依赖项冲突的依赖项,则 MNG-1577 的修复可能会更改您在使用 2.0.6 运行构建时获得的版本。为了确保平稳过渡,有一个工具可以检测这些条件。

在你的项目中,运行mvn dependency:analyze(一定要使用 2.0.5 否则插件不会检测到不匹配)。这将显示类似于以下的输出:

[INFO] [dependency:analyze]
[INFO] Used declared dependencies:
[INFO]    org.codehaus.plexus:plexus-archiver:jar:1.0-alpha-7:compile
[INFO]    junit:junit:jar:3.8.1:test
[INFO]    org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9:compile
[INFO]    org.apache.maven:maven-model:jar:2.0.5:compile
[INFO]    org.apache.maven:maven-project:jar:2.0.5:compile
[INFO]    org.apache.maven.shared:file-management:jar:1.1:compile
[INFO]    org.codehaus.plexus:plexus-utils:jar:1.1:compile
[INFO]    org.apache.maven:maven-artifact:jar:2.0.5:compile
[INFO]    org.apache.maven:maven-plugin-api:jar:2.0.5:compile
[INFO]    org.apache.maven.shared:maven-plugin-testing-harness:jar:1.0-beta-1:test
[INFO]    org.apache.maven.shared:maven-dependency-analyzer:jar:1.0:compile
[INFO] Used undeclared dependencies:
[INFO]    None
[INFO] Unused declared dependencies:
[INFO]    None
[INFO] Found Resolved Dependency / DependencyManagement mismatches:
[INFO]  Dependency: commons-lang:commons-lang:jar
[INFO]          DepMgt  : 1.0
[INFO]          Resolved: 2.3
[INFO]  Dependency: commons-digester:commons-digester:jar
[INFO]          DepMgt  : 1.6
[INFO]          Resolved: 1.7
[INFO]  Dependency: javax.servlet:servlet-api:jar
[INFO]          DepMgt  : 2.3
[INFO]          Resolved: 2.4
[WARNING] Potential problems found in Dependency Management

在上面的示例中,您可以看到我实际上得到的版本与我所要求的不同。在 2.0.6 中,我会突然从 2.3 降级到 commons-lang 1.0,从 1.7 降级到 commons-digester 1.6,从 2.4 降级到 servlet-api 2.3。根据 jar 和您的项目,这可能表现为编译错误或运行时错误。

当您看到这些不匹配时,建议的方法是调整您的 dependencyManagement 部分以获得您实际获得的版本(在这种情况下,分别为 2.3、1.7 和 2.4)。然后,当您升级到 2.0.6 时,您将在构建中获得与当前在 2.0.5 中获得的相同版本。

您还应该特别注意 Used Undeclared 依赖项,因为这表明您正在使用未声明的东西。如果未明确声明依赖项,则插件可能无法检测到依赖项管理之间的特定不匹配。在您的项目中使用未声明的依赖项是一个危险的提议,因为它没有为 Maven 提供正确的信息来正确选择正确的版本。建议的解决方法是将分析结果的任何依赖项添加到您的 pom.xml 中。

此目标还可以检测与dependencyManagement excludes 的冲突,以显示被排除的文件从哪里爬回并显示单个pom 覆盖dependencyManagement 的位置。这些东西不受 2.0.6 的直接影响,但可以得心应手地知道。

升级到 2.0.6 后,您可能希望删除已实施的针对 MNG-1577 的解决方法。这些通常是在你的 pom 中引入一个依赖,而不是简单地覆盖传递版本。如果您的 pom 中有解决方法,它们将显示为未使用的声明依赖项。请注意,当前测试和运行时依赖项已从使用分析中排除。

在这里阅读更多: