当前位置: 首页 > 知识库问答 >
问题:

maven enforcer是否忽略DependencyManager部分?

沃盛
2023-03-14

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

<dependencyManagement>
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>[3.18.1-GA]</version>
    </dependency>
</dependencyManagement>

这将根据它覆盖可传递依赖项的版本。安装(并重新安装依赖项以匹配版本边界)后,组织。阿帕奇。专家插件:maven依赖插件:2.8:树打印:

org.javassist:javassist:jar:3.18.1-GA:compile (version selected from constraint [3.18.1-GA,3.18.1-GA])

但是(最初,没有重新安装依赖项)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>

另一个用途

org.javassist:javassist:3.18.1-GA

为什么执法者与依赖树不一致?有什么可能是错的?如果我使用版本边界,它们是否会受到尊重,并且我可以跳过为此目的使用执行者?

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

共有1个答案

牧熙云
2023-03-14

Tl;灾难恢复:dependencManagement覆盖可传递依赖项的版本

这个答案的全部功劳归于安迪·丹尼,我偶然发现了他的博客帖子:
https://www.fizz-buzz.com/blog/2012/08/02/maven-enforcer-plugin-vs-dependencymanagement

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

  1. 为子模块/子项目中的依赖项设置默认版本
  2. 重写传递依赖的版本

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

  1. 我不会将依赖项放在顶级POM的dependencyManagement部分。当我出现不匹配时,我希望maven enforcer插件提醒我。相反,我使用版本属性,正如我在上面的方法#1中提到的那样

这里的权衡是,你有一个工作的执行者插件,可以帮助你解决依赖地狱,但必须手工做更多的事情。

 类似资料:
  • 我已经添加了JVM start参数: 但在原木里我看到了

  • 我的库需要连接到任意的AWS-IoT帐户,因此我在实例化AWS客户端时传递所需的凭据: 根据boto3文档(摘录如下),以这种方式传递的凭据应该覆盖所有其他凭据。然而,此调用从Boto3生成以下日志消息: 我真的不希望boto3拾取用户可能在他们的系统上配置的任何凭据——我希望它只使用我传递给boto3.client()的凭据。有什么想法如何确保这一点? 两份文件摘录:

  • 抱歉,如果以前有人问过这个问题,但我花了很长时间搜索都没有成功。 我有一个面板,我试图使用GridBagLayout添加一些组件。 问题是,出于某种原因,我无法理解-我试图添加的JTextArea似乎忽略了分配给它的宽度-它似乎接受高度没有问题。 除了文本区域之外,所有组件都添加得很好——文本区域的宽度应该为3,但显示宽度为1。 我不明白为什么会这样,有人能帮忙吗? 提前感谢您的帮助。 代码:(编

  • 本文向大家介绍Git 检查文件是否被忽略,包括了Git 检查文件是否被忽略的使用技巧和注意事项,需要的朋友参考一下 示例 该git check-ignore命令报告Git忽略的文件。 您可以在命令行上传递文件名,git check-ignore并将列出被忽略的文件名。例如: 在此,.gitignore中仅定义了* .o文件,因此Readme.md未在.git的输出中列出git check-igno

  • 我有以下JPA映射(为了简洁起见,getter和setter都是从代码中生成的,DDL可能起作用,也可能不起作用): 费用 类别 标签 与JpaRepository一起使用 所以我使用的是一个JPA假设,它看起来像这样: 当我使用JpaRepository的默认findAll()方法时,我得到一个n1选择问题: 但是,当我使用自己的findAllExpensesExploded()方法时,我得到一

  • 问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc