如何以编程方式从pom.xml执行特定的插件/ Mojo?

2022-09-04 04:35:17

我是其中一个Maven插件(不是Apache/Codehaus,完全是独立)的作者。有时我会收到支持请求或测试用例,其中我真的需要使用现有的.基本上,我得到的测试用例是样本/测试项目(带有,等等)。pom.xmlpom.xmlsrc/main/resouressrc/main/java

我需要的是一种方法:

  • 加载现有的 .pom.xml
  • 在那里找到我的插件的特定执行(通常它是唯一的一个)。
  • 获取 - 完全初始化/配置,并正确注入所有组件和参数的实例。MyMojo
  • 执行。MyMojo
  • 重要的是测试项目是单独的项目,我不想将它们复制到插件的Maven模块中。
  • 我希望能够在没有远程调试的情况下执行此操作。

通过调试,我的意思是能够在断点(也是有条件的)上设置和停止,在源代码上单步执行/退出/结束。

理想情况下,我希望能够 - 例如在JUnit测试或某个类的方法中。(我可以提供,等等。所有其他定义都应该从中加载。executeMyMojoFrom(new File("pom.xml"))maingroupIdartifactIdpom.xml

我怎样才能做到这一点?


到目前为止,我尝试过什么:

  • Debug As...在 Eclipse 中 - 工作得不够好(找不到源代码,断点不起作用,因为它不是 Java 项目上下文)pom.xml
  • Maven Embedder/Invoker 解决方案 - 通过 CLI 在单独的进程中生成事物。忘记断点,无需调试。
  • 使用 Eclipse 进行远程调试,然后按照 Pascal Thivent 的建议从 Eclipse 进行远程调试。这是迄今为止最好的选择。但是,远程调试意味着单独启动,并且也不能保证我在Eclipse中的JAR与所使用的JAR完全相同。所以这里有一定的距离。mvnDebugmvnDebugmvnDebug
  • maven-plugin-testing-harness - 我实际上认为这将完成任务。但首先,我在篮筐里跳了几个小时,只是为了让它开始。所有重要的依赖项都是“提供的”,因此我首先必须找出这些工件的正确版本组合。然后 - 才发现抽象MojoTestCase仅在您要测试的插件模块中工作。当我认为这是Maven插件的测试工具时,我可能错了。它似乎是该插件模块中插件的测试工具。这不是不合逻辑的,但对我的情况没有帮助。我想在其他模块中测试我的插件。maven-plugin-testing-harness

因此,现在我通过远程调试解决方案获得了最佳结果。但是我正在寻找的实际上是类似于但不是硬连接到插件模块的东西。有没有人碰巧有一个提示,如果这种方法存在于Maven工件的某个地方?maven-plugin-testing-harness

更具体地说,我想写一些这样的内容:

 public void testSomething()
        throws Exception
    {
        File pom = getTestFile( "pom.xml" );
        assertNotNull( pom );
        assertTrue( pom.exists() );

        MyMojo myMojo = (MyMojo) lookupMojo( "myGroupId", "myArtifactid", ...,
                                             "myGoal", pom );
        assertNotNull( myMojo );
        myMojo.execute();

        ...
    }

将其与此处进行比较 - 它几乎就在那里。不应该硬连接到Maven模块中(因为它在 中)。MyMojoTestmymojomaven-plugin-testing-harness


更新

评论中对问题的一些答案:

你的意思是你不希望这样的测试类,即驻留在与相同的项目内,即你的插件项目?为什么?MyMojoTestMyMojo

完全。我想调试现有Maven项目中的插件执行,我不想将该项目移动到我的插件项目中以便能够运行测试。我希望能够测试/调试现有项目。理想情况下,我只需要在项目的src/test/jaca中添加依赖项和子类。这将是调试执行的良好工具。将目标项目拖到我的Mojo项目中开销太大了 - 而且大多数情况下,这些都不是我想长期保留的测试用例。我希望,这回答了,为什么。my-maven-plugin-testingMyMojoTest

无论如何,这只是一个约定,以保持插件模块的内部,而不是规则......project-to-test/pom.xmlsrc/test/resources

我的问题不是 的位置,这是容易配置的。我的困难在于,以某种方式硬编码为Mojo的项目。它使用Mojo,在包含项目中查找其他特殊文件/描述符。所以我不能在非Mojo项目中使用它,或者我可以吗?这是我的问题。pom.xmlproject-to-testmaven-plugin-testing-harnesspom.xml

我不知道为什么没有帮助你...Debug as...

也不确定,但(1)断点不起作用,(2)由于某种原因,源代码没有“附加”。


答案 1

如果 没有像它应该的那样为你工作,你可以尝试使用 一些工作。Debug asmojo-executor

https://github.com/TimMoore/mojo-executor

以下是以编程方式执行目标的方式:copy-dependenciesMaven Dependency Plugin

executeMojo(
    plugin(
        groupId("org.apache.maven.plugins"),
        artifactId("maven-dependency-plugin"),
        version("2.0")
    ),
    goal("copy-dependencies"),
    configuration(
        element(name("outputDirectory"), "${project.build.directory}/foo")
    ),
    executionEnvironment(
        mavenProject,
        mavenSession,
        pluginManager
    )
);

、 和变量应该通过正常的 Mojo 注入来注入。是的,这意味着这应该从另一个maven插件的上下文中执行。现在我想起来了,这是否会以任何方式帮助你仍然是一个问题,因为这仍然依赖于底层容器注入这些组件。projectsessionpluginManagerplexus

我最初的想法是让你构建一个 maven 插件,该插件将通过上述方式调用您的插件,然后序列化 、 、 , ,即所有注入的组件,然后使用这些对象将来从没有您构建的插件的独立类调用您的插件。jaxb2mojo-executormavenProjectmavenSessionpluginManagerplexusjaxb2


答案 2

推荐