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

时间:2014-12-13 21:16:29

标签: java maven maven-plugin

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

我需要的是一种方法:

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

通过调试我的意思是能够设置和暂停断点(也是有条件的),进入/退出/覆盖源代码。

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

我如何实现这一目标?


到目前为止我已尝试过:

    Eclipse中Debug As...上的
  • pom.xml - 效果不佳(找不到源代码,断点不是因为它不是Java项目上下文)
  • Maven Embedder / Invoker解决方案 - 通过CLI在单独的进程中生成东西。忘记断点,不要调试。
  • 使用mvnDebug进行远程调试,然后按照Pascal Thivent here的建议从Eclipse进行远程调试。这是迄今为止最好的选择。但是,远程调试意味着单独启动mvnDebug,并且还不能保证Eclipse中的JAR与mvnDebug使用的JAR完全相同。所以这里有一定的距离。
  • maven-plugin-testing-harness - 我实际上认为这将完成任务。但首先我只是跳了几个小时,才开始。所有重要的依赖关系都是"提供"所以我首先要弄清楚这些工件的正确组合。然后 - 只发现AbstractMojoTestCase仅适用于您要测试的插件模块。当我认为maven-plugin-testing-harness是Maven插件的测试工具时,可能我错了。它似乎是该插件模块中插件的测试工具。这不是不合逻辑的,但对我的情况没有帮助。我想在其他模块中测试我的插件。

所以现在我通过远程调试解决方案获得了最佳效果。但我正在寻找的东西真的像maven-plugin-testing-harness但不是硬件连接到插件模块。如果这样的方法存在于Maven工件的某个地方,是否有人碰巧有提示?

更具体地说,我想写一些类似的东西:

 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();

        ...
    }

将它与MyMojoTest here进行比较 - 它几乎就在那里。不应该硬连线到mymojo Maven模块(就像在maven-plugin-testing-harness中一样)。


更新

评论中的问题几乎没有答案:

  

你的意思是你不想要这样的测试类,即MyMojoTestMyMojo一样驻留在同一个项目中,即你的插件项目?那是为什么?

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

  

无论如何,它仅仅是将project-to-test/pom.xml保留在插件模块的src/test/resources内的惯例,而不是规则...

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

  

我不确定为什么Debug as...没有帮助你...

也不确定,但(1)断点不起作用,(2)源代码未附加"出于某种原因。

1 个答案:

答案 0 :(得分:1)

如果Debug as对您不起作用,您可以尝试使用mojo-executor进行一些工作。

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

这是以编程方式执行copy-dependencies的{​​{1}}目标的方法:

Maven Dependency Plugin

应通过正常的Mojo注入注入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 ) ); projectsession变量。是的,这意味着这应该从另一个maven插件的上下文执行。现在我想一想,这是否会以任何方式帮助你仍然是一个问题,因为这仍然依赖于底层pluginManager容器注入这些组件。

我最初的想法是让你构建一个maven插件,通过上面的plexus调用你的jaxb2插件,然后序列化mojo-executormavenProjectmavenSession,即所有pluginManager注入的组件,然后使用这些对象将来从没有您构建的插件的独立类调用您的plexus插件。