问题标签 [maven-enforcer-plugin]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
267 浏览

maven - Maven:在多项目开发中确保相同的主要父 pom 版本

我们的团队有多个项目;大多数项目只是库。为简单起见,我们假设这些库不相互依赖,并且有一个使用它们的项目,例如:

为避免在“Main”中出现意外,我们希望确保我们自己的所有项目都使用相同版本的 3rd-party 库,以便构建“Lib-A”和“Lib-B”使用相同版本的库 X 进行测试。

为了实现这一点,我们使用了一个父 pom,其中包含<dependencyManagement>详细说明所有相关 3rd 方库的版本以及它们的传递依赖项的部分。这个父 pom 被所有项目继承,即上面示例中的“Main”、“Lib-A”和“Lib-B”。然后每个子 pom 只会使用<dependency>而不指定任何版本。我们还有Maven 强制插件的 dependencyConvergence 规则,以确保我们没有错过任何项目中的任何库冲突。

问题:增加 X 的版本:'Lib-A' 的开发者将 X 的版本从 1.0 增加到 2.0。所以他在父 pom 中更改 X 的版本,增加 parent 的版本,释放父 pom,并通知来自“Main”的人他们现在应该使用新的父。情况变成这样:

包括“Main”在内的所有内容都构建良好,“maven enforcer plugin”没有检测到任何冲突,因为 X 的版本在 Parent:2.0 中明确指定,“Main”从该版本继承。所以我们发布了'Main'。

哎呀…… Lib-B 从未使用 X:2.0 构建。它有很好的单元测试可以发现问题,但我们从未尝试过。我们忘记更新 Lib-B,尝试使用 X:2.0 并发布它。'Main' 的构建仍然没有问题,并且 Maven 执行器插件从未抱怨过。

问题:我们需要 Maven 来检测是否存在从相同工件但不同主要版本继承的依赖项并导致构建失败。
在我们的例子中,构建必须失败,因为“Main”和“Lib-A”继承自 Parent:2.0,但“Lib-B”继承自 Parent:1.0。

到目前为止我的解决方案(一个 hack):除了继承之外,向所有项目(即“Main”、“Lib-A”和“Lib-B”)添加对父 pom 的显式依赖:

然后使用<bannedDependencies>maven enforcer 插件的规则来禁止其他主要的 Parent 版本<dependencyConvergence/>(如果我们想要失败,即使是次要的 Parent 版本冲突,我们也可以使用它的规则)。

在父 pom 的主要版本冲突时,是否有一种不那么笨拙和麻烦的方法来失败?
可能是我们管理 maven 依赖项的整个方法是错误的,那么推荐的方法是什么?


更新:在放弃之前,尝试按照@JF Mayer 的建议和此处
描述的方式为 maven-enforcer-plugin 编写自己的规则。原因:

  1. 首先,从依赖项中无法获得父pom信息,至少无法从maven的DependencyGraphBuilder构建的节点中获得
  2. 好的,我已将我的父 pom 添加为子级的显式依赖项,并尝试使用它DependencyGraphBuilder来检测具有不同主要版本的父级的依赖项。没门!可以看出,mvn dependency:tree它也使用这个类,DependencyGraphBuilder不提供所有依赖项,因此它不能用于检测依赖项冲突。这就是为什么<dependencyConvergence>maven 执行器规则使用一个超级弃用DefaultDependencyTreeBuilder的,甚至已经从 GitHub 和其他任何地方删除 - 对于无故障的自定义解决方案来说,这不是一个好的选择。
0 投票
2 回答
7851 浏览

java - 使用 Maven 执行器跳过模块

enforcer在根 pom 的多节点项目中使用插件,但我有一个测试模块,我真的不关心在那里运行插件,因为它不会创建任何 jar 并且仅用于测试目的。有没有办法跳过插件配置中的模块之一?

检查文档我找不到任何东西。只是如何禁止一些特定的依赖。https://maven.apache.org/enforcer/enforcer-rules/bannedDependencies.html

将插件放在每个子模块中的解决方案是可能的,但这很危险,因为如果我创建一个新的子模块,我可能会忘记在那里添加它。

这是我的插件配置。

0 投票
1 回答
425 浏览

java - Maven 依赖项排除不起作用

我正在使用enforcerMaven 的插件,我看到一种我不太理解的行为,而且很危险。

假设我有一个冲突,因为依赖已经A并且bla.jar:1.0与我的依赖冲突Bbla.jar:2.0

然后为了解决冲突,我排除了bla.jar:1.0fromA

期望应用程序将获得前bla.jar:2.0类路径。但是后来我看到当我运行一些单元测试时,java proce3ss 根本找不到bla.jar类路径,并且在运行时给了我ClassNotFound

知道这里有什么问题吗?

我在我的 pom 中定义了从上到下 B 然后是 A

0 投票
0 回答
31 浏览

maven - 如果依赖项依赖于当前项目的兄弟姐妹,如何使 Maven 构建失败?

想象一下,我有以下项目结构:

而且我希望在存在依赖“循环”时构建失败,因为 b-impl 依赖于(传递地)a-api 而 a-impl 依赖于 b-api(请注意,这并不是真正的循环)。

我不允许定义额外的依赖项(例如在 a 或 b 中),并且我正在寻找一个会自动失败的构建插件/配置。

我目前正在评估是否可以使用强制插件的自定义规则: http ://maven.apache.org/enforcer/enforcer-api/writing-a-custom-rule.html

0 投票
2 回答
1037 浏览

java - maven 强制执行者不遵守规则

我正在使用Maven 强制执行器版本3.0.0-M3

在以下配置了规则pom.xml

然后我验证了配置是否正确评估:

但似乎不遵守规则,因为当我运行时enforceNo rules are configured.会显示错误消息

通过命令行参数提供规则时,执行者似乎确实评估了它们

但是<AlwaysFail />/project/build/plugins/plugin/executions/execution/configuration/rules/AlwaysFail(xpath) 中的设置似乎不会产生相同的结果——No rules are configured在没有命令行参数的情况下执行时继续获取。

我在 debian buster 下使用 maven 3.6.3 和 openjdk 1.8

更新:

将块移到<configuration>块外<executions>并在调试模式下运行后,我得到输出,其中显示执行java.version=0.7器检测到它,但它不会使构建失败。见下文:

当未满足所需的 java 和 maven 版本时,如何使执行器失败?

0 投票
3 回答
57 浏览

java - Maven:强制在运行时存在类路径资源

我想使用 Maven 强制运行时类路径中存在某些资源。

任何建议如何实现这一目标?

谢谢和亲切的问候

奥利弗

编辑:显然我的问题不够精确。我想确保 style.css 文件位于运行时类路径的根目录中。我不关心这个资源是如何进入类路径的。我只想确保资源存在于运行时类路径中。

0 投票
0 回答
168 浏览

maven - Maven Enforcer:如何从 beanshell 规则访问 Maven 属性

我使用 maven-enforcer-plugin 成功创建了一个 evaluateBeanshell 规则,它扫描工作区中的文件以查找常见错误。

使用硬编码路径,该规则可以正常工作。当我想使用周围 pom 中的 ${project.basedir} 变量时,脚本会在我的 Windows 机器上中断。

在调试输出中,该行:

被替换为:

是否有另一个带有经过消毒的斜线的 Maven 属性,或者是否有另一种访问 ${project.basedir} 的方法?代码示例中概述的 hack 是可行的,但我不喜欢强迫我发表评论的 hack。

0 投票
2 回答
913 浏览

java - 如何在多模块 Maven 项目的子模块中禁用某些强制执行规则?

我在多模块 maven 项目中使用 maven-enforcer 插件。假设我的项目结构如下

我在 pom 中的执行器插件main如下所示

在子模块 ( query) 中,如果我需要禁用其中一项强制执行规则(比如说DependencyConvergence),有人可以告诉我如何做到这一点吗?

Maven 版本 - 3.6.1

0 投票
2 回答
147 浏览

maven - Maven 执行器插件未执行

在 pom 中,我有一个工件 id 的参数:

我打算强制任何人使用这个 pom 来传递参数 -Dapp ;为此,我正在使用强制插件:

然而,这并不强制要求 -Dapp 必须是基础,而是我得到的是来自 pom 的错误

[错误] 构建无法读取 1 个项目-> [帮助 1] org.apache.maven.project.ProjectBuildingException:处理 POM 时遇到一些问题:[错误] com.abc 的“dependencies.dependency.artifactId”。自动化:${app}-xyz-extension:test-jar 的值为 '${app}-taas-extension' 与有效的 id 模式不匹配。@ 第 18 行,第 19 列

Plugins 元素放置在 build 中,如下所示:

我错过了强制插件的基础知识吗?

0 投票
2 回答
655 浏览

java - 配置文件“compile-java8-release-flag”中的 JDK 版本无效:无限范围:[9,对于项目 org.jboss:jboss-parent

我们正在将 Java 应用程序从 JBoss EAP 6 迁移到 JBoss EAP 7.3。我们将 jboss BOM 文件更新为 Jakarta EE 8 版本:

在构建我们的最终 EAR 文件时,maven 构建失败并出现以下错误:

我们发现我们包含的 bom 使用 org.jboss.jboss-parent 作为父级,它包含以下配置文件:

在 jdk 标记中,版本从末尾缺少 ) 字符。有一个更新版本的 jboss-eap-jakartaee8-with-tools 仍然使用 jboss-parent:35 所以它会产生同样的错误。

没有关于这个话题的相关讨论。还有一个版本为 36 的 jboss-parent 修复了这个问题,但是它没有在任何 bom 中使用。在官方的 redhat maven 存储库增量更新和 eap 7.3 更新中都没有提到这个问题。

除了手动编辑本地 maven 存储库中的 jboss-parent 之外,如何解决此问题?有官方解决这个问题吗?

谢谢你。