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

lex*_*ore 14 java maven-plugin maven

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

我需要的是一种方法:

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

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

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

我怎样才能做到这一点?


到目前为止我尝试过的:

  • Debug As...pom.xmlEclipse中-不工作不够好(源代码没有找到,断点不作为它不是一个Java项目环境中工作)
  • Maven Embedder/Invoker解决方案 - 通过CLI在单独的进程中生成东西.忘记断点,没有调试.
  • 远程调试mvnDebug由帕斯卡尔Thivent建议,然后远程调试在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();

        ...
    }
Run Code Online (Sandbox Code Playgroud)

将它与MyMojoTest 这里相比 - 它几乎就在那里.应该不要硬连接到mymojoMaven模块(就像它一样maven-plugin-testing-harness).


更新

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

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

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

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

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

而且我不确定为什么Debug as...没帮你...

不确定,但是(1)断点不起作用,(2)源代码由于某种原因没有"附加".

mys*_*cks 4

如果它Debug as没有达到应有的效果,您可以尝试使用它,mojo-executor但需要做一些工作。

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

这是您以编程方式执行copy-dependencies目标的方式Maven 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
    )
);
Run Code Online (Sandbox Code Playgroud)

、和变量应该通过正常的 Mojo 注入来注入project。是的,这意味着这应该从另一个 Maven 插件的上下文中执行。现在我想了一下,这是否会对您有任何帮助仍然是一个问题,因为这仍然依赖于底层容器注入此类组件。sessionpluginManagerplexus

我最初的想法是让你构建一个 Maven 插件,它可以jaxb2通过上面的方式调用你的插件mojo-executor,然后序列化mavenProject, mavenSession, pluginManager, 即所有注入的组件,然后使用这些对象将来从独立类plexus调用你的插件,而无需jaxb2您构建的插件。