Maven:在一个阶段运行插件两次,与另一个插件交错

2024-01-03

对于我们的端到端测试,我们需要执行以下逻辑流程:

  1. 在数据库中创建并设置 e2e 架构(用户)(pre-integration-test)
  2. 运行 Liquibase 以最初填充架构 (pre-integration-test)
  3. 将特定于 e2e 的测试数据添加到数据库表中(pre-integration-test)
  4. 启动 Tomcat (pre-integration-test)
  5. 在 Tomcat 中运行 Web 应用程序(integration-test)使用量角器
  6. 关闭 Tomcat (post-integration-test)
  7. 清理数据库:删除架构(post-integration-test)

对于运行 SQLsql-maven-plugin使用,但是此流程不适合常规 POM 布局:

  • SQL 插件必须在以下期间运行pre-integration-test twice, before and after the liquibase-maven-plugin
  • SQL 插件必须运行before期间Tomcat插件pre-integration-test,但是它必须运行after during post-integration-test,以便在 Tomcat 关闭后删除数据库架构。

据我所知Maven 文档 https://maven.apache.org/guides/mini/guide-default-execution-ids.html,POM中插件的顺序定义了同一阶段的执行顺序,并且一个插件不能在同一个POM中被提及两次。

Question:除了编写多次调用 Maven 的 shell 脚本之外,还有什么方法可以实现这一点吗?

附:找到了类似的没有回答的问题 https://stackoverflow.com/questions/17137505/maven-interleave-multiple-executions-of-a-plugin-with-other-plugin-executions-i.


给出下面的 POM 示例:

<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sample</groupId>
    <artifactId>sample-project</artifactId>
    <version>0.0.2-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.5</version>
                <executions>
                    <execution>
                        <id>print-hello</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <echo message="hello there!" />
                            </target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.5.0</version>
                <executions>
                    <execution>
                        <id>exec-echo</id>
                        <phase>validate</phase>
                        <configuration>
                            <executable>cmd</executable>
                            <arguments>
                                <argument>/C</argument>
                                <argument>echo</argument>
                                <argument>hello-from-exec</argument>
                            </arguments>
                        </configuration>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.5</version>
                <executions>
                    <execution>
                        <id>print-hello-2</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <echo message="hello there 2!" />
                            </target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

我们实际上正在配置:

  • The maven-antrun-plugin打印hello there! message
  • The exec-maven-plugin打印hello-from-exec message
  • The maven-antrun-plugin打印hello there 2! message

目标执行都属于同一阶段,validate,并且我们期望以相同的定义顺序执行。

然而,当调用(-q选项用于精确且仅具有它们的输出):

mvn validate -q

我们将得到以下输出:

main:
     [echo] hello there!

main:
     [echo] hello there 2!
hello-from-exec

也就是说,对于同一阶段,Maven 执行定义的插件,但是合并相同插件的所有定义的执行(即使定义为不同的插件)plugin节),然后按照合并定义的顺序执行它们。

不幸的是,没有机制可以避免这种情况merging。我们用于配置插件执行行为的唯一选项是:

  • The inherited https://maven.apache.org/pom.html#Plugins configuration entry:

    true or false,此插件配置是否应应用于从该插件继承的 POM。默认值为true.

  • The combine.children and combine.self to

    通过向配置元素的子元素添加属性来控制子 POM 如何从父 POM 继承配置。

这些选项都对我们没有帮助。在这种情况下,我们需要一种merge属性上的execution元素或默认情况下有不同的行为(即,Maven 应该尊重定义顺序)。


从命令行调用单个执行,如下所示:

mvn antrun:run@print-hello exec:exec@exec-echo antrun:run@print-hello-2 -q

相反,我们会得到所需的输出:

main:
     [echo] hello there!
hello-from-exec

main:
     [echo] hello there 2!

但在这种情况下:

  • 我们不执着于任何相
  • 我们通过命令行(以及通过新的feature https://issues.apache.org/jira/browse/MNG-5768仅自 Maven 起可用3.3.1

您可以通过脚本或通过 exec-maven-plugin 调用 maven 本身来实现完全相同的效果,但是同样适用:不应用阶段,仅执行顺序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Maven:在一个阶段运行插件两次,与另一个插件交错 的相关文章

  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • 使用替换字符串中多个单词的最有效方法[重复]

    这个问题在这里已经有答案了 此刻我正在做 Example line replaceAll replaceAll cat dog replaceAll football rugby 我觉得那很丑 不确定有更好的方法吗 也许循环遍历哈希图 ED
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • Angular4中的ActivatedRoute和ActivatedRouteSnapshot有什么区别

    有什么区别ActivatedRouteSnapshot and ActivatedRoute在 Angular 4 中 我的理解是ActivatedRouteSnapshot是一个孩子ActivatedRoute 意思是ActivatedR
  • 扩展中的延迟加载属性 (Swift)

    我知道 swift 不允许在扩展中声明存储的属性 出于同样的原因 延迟加载的属性也是被禁止的 我知道计算属性是一种选择 但我的任务应该只执行一次 是否有任何黑客 替代 被忽视的方法来模仿扩展中的惰性变量 Thanks 如果你不需要参考sel
  • requestWindowFeature(Window.FEATURE_NO_TITLE);给出例外

    import android content pm ActivityInfo import android os Bundle import android preference ListPreference import android
  • 只有我吗?我发现与 XPath 相比,LINQ to XML 有点麻烦

    我是一名 C 程序员 因此我无法利用 VB 中炫酷的 XML 语法 Dim itemList1 From item In rss
  • 如何验证 reCAPTCHA V2 Java (Servlet)

    这是一个问答风格的帖子 我将同时发布问题和答案 主要原因是我花了相当多的时间寻找验证 recaptcha V2 的最简单方法 因此 我将分享我的知识 以避免进一步浪费开发人员的时间 如何做一个服务器端验证谷歌的验证码 V2 or 隐形验证码
  • Docker构建npm安装错误网络超时

    我尝试将映像构建到节点应用程序 但是当我执行 docker build 时显示运行 npm install 时出现错误 npm 错误 网络超时时间 https registry npmjs org cookie cookie 0 4 0 t
  • 如何并行化复杂的 for 循环

    我有一个复杂的for循环 其中包含循环中对多个记录的多个操作 循环看起来像这样 for i j k in zip is js ks declare multiple lists like a b if i for items in i va
  • 正则表达式来匹配和验证互联网媒体类型?

    我想验证通过 API 输入的互联网类型 你能帮忙写一个正则表达式来匹配吗 下面的示例类型来自http en wikipedia org wiki Internet media type http en wikipedia org wiki
  • 出现错误“‘targetFramework’属性当前引用的版本高于已安装的 .NET Framework 版本”

    我在 IIS7 服务器上发布了 ASP NET Web API 当我在本地测试它时 我收到以下框架错误 配置错误 处理过程中发生错误 服务此请求所需的配置文件 请查看 具体错误详情如下并修改你的配置文件 适当地 解析器错误消息 target
  • C# 中的 Onvif 事件订阅

    我正在用 C 实现 ipCamera 编码器管理系统 该系统将管理来自多个供应商的多个 ipCamera 和 或编码器 使用 Onvif 代替每个 ipcamera 或编码器 sdk 将是一个好处 管理系统的关键概念之一是监听来自摄像机的事
  • 进行缓冲区溢出利用时未获取 root shell

    我正在学习 Linux x86 二进制文件中的缓冲区溢出漏洞 我正在执行经典的堆栈粉碎 通过禁用 ASLR 并通过禁用 NX 位和堆栈金丝雀来编译二进制文件 从而在 Ubuntu 12 04 VM 中生成根 shell 在执行期间 返回地址
  • 如何让显示器处于待机状态而不让它被唤醒

    我有 3 个显示器 但我不需要它们一直打开 我可以用电源按钮关闭它们 但我想使用它们的待机模式 就像 Windows 当我们让电脑闲置一段时间时所做的那样 它会关闭显示器 硬盘等 但当然 我想继续使用电脑 让显示器处于待机状态 其他人必须保
  • 使用 UIPanGestureRecognizer 更新约束

    我在屏幕中间有一个黑色的分隔符视图 分隔顶部容器视图 橙色 和底部容器视图 绿色 可以使用 panGesture 上下拖动分隔符视图 但我无法获取顶部和底部视图来更新其约束并调整大小 橙色视图的底部和绿色视图的顶部应始终与separator
  • TFHppleElement (Hpple),在 iphone 上解析 HTML

    我正在使用 Hpple 到目前为止它非常棒 但是我想将所有 div 放入另一个中 我可以做到 但随后我无法进一步解析内容 innerHTML 在源代码中它被标记为innerHTML而不是innerText 询问元素内容不会返回任何内容 因为
  • XML 解析错误:为什么需要分号? [复制]

    这个问题在这里已经有答案了 我是一名新手 正在努力尝试将 XML 从外部第三方导入 SQL Server 我用下面的 XML 尝试了这个 SQL 它在名称标签中间出现了 XML 解析 第 10 行 第 81 字符 需要分号 为什么 为什么它
  • 如何在 python 中绘制半对数图? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 python 中绘制半对数图 X 轴为对数 y 轴为线性 目前我正在绘制相位与欧米伽的关系 其中我需要 y 轴是线性的 而 x
  • Android 内存泄漏,EMA 怀疑:“byte[]”由“<系统类加载器>”加载

    我正在编写一个小型的单活动 Android 应用程序 并遇到内存泄漏错误 为此我找不到来源 首先 该应用程序计算基本内容并以结构化方式显示结果 计算很简单 虽然有一些图像 但它们大约有 50 个图标 总共不到 4MB 我已经安装了 Ecli
  • 将字符串文件转换为json格式文件

    好吧 假设我有一个名为 string txt 的字符串文本文件 我想将其转换为 json 文本文件 我应该做什么 我尝试过使用 json loads 但它对我不起作用 这是我的文本文件的一部分 rdian id 16142867056665
  • 使用 linq 更新对象的性能更好

    我有两个自定义对象列表 如果另一个列表中存在与另一对字段匹配的对象 则希望更新一个列表中所有对象的字段 这段代码更好地解释了问题并产生了我想要的结果 然而 对于较大的 20k 列表以及包含匹配对象的 20k 列表 这需要相当长的时间 31
  • Maven:在一个阶段运行插件两次,与另一个插件交错

    对于我们的端到端测试 我们需要执行以下逻辑流程 在数据库中创建并设置 e2e 架构 用户 pre integration test 运行 Liquibase 以最初填充架构 pre integration test 将特定于 e2e 的测试