Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
maven enforcer是否忽略DependencyManager部分?_Maven_Maven Enforcer Plugin - Fatal编程技术网

maven enforcer是否忽略DependencyManager部分?

maven enforcer是否忽略DependencyManager部分?,maven,maven-enforcer-plugin,Maven,Maven Enforcer Plugin,我在父pom的imported dependencyManagement部分中指定了库的版本。我确认我的有效pom只有一次出现这种依赖性。它位于dependencyManagement部分: <dependencyManagement> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactI

我在父pom的imported dependencyManagement部分中指定了库的版本。我确认我的有效pom只有一次出现这种依赖性。它位于dependencyManagement部分:

<dependencyManagement>
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>[3.18.1-GA]</version>
    </dependency>
</dependencyManagement>
但是(最初,没有重新安装依赖项)enforcer抱怨版本错误:

[WARNING] Rule 1: org.apache.maven.plugins.enforcer.DependencyConvergence failed with message:
Failed while enforcing releasability the error(s) are [
Dependency convergence error for org.javassist:javassist:3.18.2-GA paths to dependency are:
...
并显示第一个可传递依赖项使用

org.javassist:javassist:3.18.2-GA
这来自于依赖关系,而依赖关系又取决于:

<dependencies>
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.18.2-GA</version>
    </dependency>
</dependencies>
为什么enforcer与依赖关系树不一致?有什么不对劲吗?如果我使用版本边界,它们会得到尊重吗?我可以跳过为此目的使用enforcer吗


此外,向相关的项目模块添加依赖项不会改变任何事情。

Tl;dr
依赖项管理
覆盖可传递依赖项的版本

这个答案的全部功劳归于安迪·丹尼,我偶然发现了他的博客帖子:

dependencyManagement
做两件事——一件众所周知,另一件很少被提及

  • 为子模块/子项目中的依赖项设置默认版本
  • 重写可传递依赖项的版本
  • 因此enforcer插件不会忽略
    依赖项管理
    。但无法识别差异,因为可传递依赖项的版本在开始工作之前已被更改。安迪·丹尼(Andy Denny)在他的博客上就如何继续提出了一个很好的建议:

  • 我不会将依赖项放在顶级POM的dependencyManagement部分。当我出现不匹配时,我希望maven enforcer插件提醒我。相反,我使用版本属性,正如我在上面的方法#1中提到的那样
  • 当maven enforcer插件通知我差异时,我会尝试看看是否可以让相关工件使用相同版本的差异依赖项。如果所涉及的所有依赖项都在我自己的工件中,我会尝试使它们在相同版本的依赖项上对齐。如果有些工件是我的,有些来自第三方,我会尝试将我的依赖项与第三方对齐,和/或寻找其他版本的第三方工件,这些工件具有相互对齐的依赖项版本,以及我的代码
  • 如果在完成上述操作后,我仍然存在无法解决的差异,我会选择我认为是有问题工件的“最适合”版本,并在项目POM的dependencyManagement部分指定该版本,maven enforcer插件在该部分报告了问题(而不是在我的顶级POM中)。我在该POM中的依赖项声明中添加了一条注释,指出了问题和解决方法,以便将来,如果我升级到新版本的依赖项,我将看到注释,并可以重新考虑是否可以解决差异
  • 这里的折衷是,您有一个可以工作的enforcer插件,它可以帮助您解决依赖性问题,但还需要手动完成更多工作

    <dependencies>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.18.2-GA</version>
        </dependency>
    </dependencies>
    
    org.javassist:javassist:3.18.1-GA