Maven 3 如何从插件中派生Maven生命周期(在适当的意义上)?

Maven 3 如何从插件中派生Maven生命周期(在适当的意义上)?,maven-3,maven-plugin,fork,Maven 3,Maven Plugin,Fork,一般问题:我正在一家采用面向服务架构的大公司测试一个web应用程序。在我们的测试环境中,由于背景噪声,外部服务经常失败。这会阻止我们的服务的集成测试正常运行,因为除非成功调用这些外部服务,否则我们的服务将无法工作。出于这个原因,我们希望能够模拟来自外部服务的响应,这样我们就不必依赖它们,并且可以单独测试我们自己的服务 有一个工具,我们希望使用它。它是一个Java程序,运行在嵌入式Jetty服务器上,充当服务调用的代理。我们的web应用程序被重新配置为调用Mockey而不是外部服务。然后根据传入的

一般问题:我正在一家采用面向服务架构的大公司测试一个web应用程序。在我们的测试环境中,由于背景噪声,外部服务经常失败。这会阻止我们的服务的集成测试正常运行,因为除非成功调用这些外部服务,否则我们的服务将无法工作。出于这个原因,我们希望能够模拟来自外部服务的响应,这样我们就不必依赖它们,并且可以单独测试我们自己的服务

有一个工具,我们希望使用它。它是一个Java程序,运行在嵌入式Jetty服务器上,充当服务调用的代理。我们的web应用程序被重新配置为调用Mockey而不是外部服务。然后根据传入的URL和标头数据,将Mockey配置为对这些调用提供动态模拟响应

为了利用这个工具,我们希望能够在Maven生命周期的预集成测试阶段启动Mockey,以便在集成测试阶段可以使用它

具体问题:为了在Maven生命周期的集成前测试和集成后测试阶段启动和关闭Mockey,我编写了一个名为Mockey Maven plugin的Maven 3插件:

mockey maven插件pom.xml文件:


4.0.0
com.mycompany.mockey
)并执行所有目标绑定到这些阶段的插件
  • 线程进入预集成测试阶段,看到mockey-maven插件的start-mockey目标绑定到预集成测试阶段,并尝试执行start-mockey目标
  • start mockey目标被注释为在第二个线程(不是第一个线程)上执行,而不在新线程上运行任何其他生命周期阶段的任何其他目标。第二个线程通过调用JettyRunner.main(args)启动Mockey的Jetty服务器,并暂时阻塞该方法(它正在运行Mockey)
  • 第一个线程继续执行其他目标和阶段(即:运行集成测试)
  • 第一个线程进入后集成测试阶段,看到mockey-maven插件的shutdown-mockey目标绑定到后集成测试阶段,并执行shutdown-mockey目标
  • shutdown mockey目标调用JettyRunner.stopServer(),它钩住JettyRunner类中的静态对象,并向关闭Jetty的第一个线程发出信号。同时,第一个线程等待来自第二个线程的信号(或者可能是轮询,我真的不知道)Jetty已经关闭
  • 第二个线程完成关闭Jetty,向第一个线程发出可以继续的信号,并自杀
  • 第一个线程继续执行任何其他目标和Maven生命周期阶段
  • 以下是我实际看到的情况:

  • Maven构建从单个线程开始
  • 该线程贯穿从validate到package()的所有生命周期阶段,并执行所有目标绑定到这些阶段的插件
  • 线程进入预集成测试阶段,看到mockey-maven插件的start-mockey目标绑定到预集成测试阶段,并尝试执行start-mockey目标
  • start mockey目标被注释为在第二个线程上执行。第二个线程从验证阶段开始重新启动整个Maven生命周期
  • 第一个线程在等待第二个线程退出时阻塞
  • 第二个线程一直运行到包阶段,然后自杀
  • 第一个线程被解除阻塞,并从它停止的地方重新开始。它自己执行start mockey目标(决不由第二个线程运行)。这将调用JettyRunner.main(args),然后线程在运行Mockey的Jetty服务器时阻塞
  • 在手动终止Jetty服务器(以及Maven生命周期的其余部分)之前,线程一直处于阻塞状态
  • 这让我感到困惑,主要是因为Maven对分叉的概念似乎与我所熟悉的不同。对我来说,分叉意味着在某一特定点上分叉,而不是重新开始,也不影响最初的过程。在Unix中分叉进程时,它复制第一个进程的堆栈和函数指针。它不会从程序开始就重新开始。类似地,当我们分叉代码存储库时,我们从当前位于原始存储库中的所有文件和目录开始。我们不会白手起家。那么,为什么当我们“分叉”Maven生命周期时,它会放弃一切,重新开始,并阻止原始线程?这看起来一点也不像是在向我开玩笑。下面是我读过的一些文档,它们描述了Maven中的“分叉”:

    • “”
    • “”
    • “”
    剩余问题:

    • 我怎样才能让Maven在我熟悉的意义上做出贡献
    • 将Maven生命周期分叉到在分叉之前发生的阶段意味着什么?例如,从预集成测试阶段进入包阶段意味着什么
    • 您认为Tomcat7插件为什么会这样做(从预集成测试阶段转向包阶段)
    • Tomcat7插件有什么不同之处,导致同一注释在我的插件中表现不同
    回答问题(见下文):
    -我是否应该在注释中为我的插件指定另一个阶段,使其按预期运行,或者我应该以一种根本不同的方式使用execute注释?

    我仍然不明白Maven在做什么,但我确实找到了解决方法:

  • 我去掉了t
     @Execute(phase= LifecyclePhase.PACKAGE)