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

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

我需要的是一种方法:

  • 加载一个现有的pom.xml
  • 找到我的插件的具体执行情况(通常是唯一的)。
  • 获取MyMojo一个实例 - 完全初始化/配置,并正确注入所有组件和参数。
  • 执行MyMojo
  • 重要的是测试项目是单独的项目,我不想将它们复制到我的插件的Maven模块中。
  • 我希望能够在没有远程调试的情况下做到这一点。
  • 通过调试,我的意思是能够在断点(也是有条件的)上设置和暂停,在源代码中进/出/结束。

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

    我怎样才能做到这一点?


    我到目前为止所尝试的是:

  • Debug As... on Eclipse中的pom.xml - 不能很好地工作(找不到源代码,断点不工作,因为它不是Java项目上下文)
  • Maven Embedder / Invoker解决方案 - 通过CLI在单独的进程中产生事物。 忘记断点,不要调试。
  • 使用mvnDebug进行远程调试,然后按照Pascal Thivent的建议从Eclipse进行远程调试。 这是迄今为止最好的选择。 但是,远程调试意味着单独启动mvnDebug ,并且也不能保证我在Eclipse中使用的JAR与mvnDebug使用的完全相同。 所以这里有一定的距离。
  • 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进行比较 - 几乎就在那里。 不应该硬编入mymojo Maven模块(因为它在maven-plugin-testing-harness )。


    更新

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

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

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

    无论如何,这仅仅是一个将project-to-test/pom.xml在插件模块的src/test/resources中的约定,而不是一个规则......

    我的问题不project-to-testpom.xml的位置,这很容易配置。 我的困难是maven-plugin-testing-harness在某种程度上被硬编码到了Mojo的项目中。 它使用Mojo的pom.xml ,在包含项目中查找其他特殊文件/描述符。 所以我无法在非Mojo项目中使用它,或者我可以吗? 这是我的问题。

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

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


    如果Debug as不适合你以及它应该,你可以尝试用一点工作来使用mojo-executor

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

    这是你如何以编程方式执行Maven Dependency Plugincopy-dependencies目标:

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

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

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

    链接地址: http://www.djcxy.com/p/60659.html

    上一篇: How to execute a specific plugin/Mojo from a pom.xml programmatically?

    下一篇: Maven: Java classes don't compile after Ant task