如何以编程方式从pom.xml执行特定的插件/ Mojo?
我是Maven插件之一(不是Apache / Codehaus,完全独立)的作者。 有时我会得到支持请求或测试案例,我真的需要用现有的pom.xml
来调试我的插件的执行情况。 基本上,我得到的测试用例是sample / test项目(带有src/main/resoures
, src/main/java
等的pom.xml
)。
我需要的是一种方法:
pom.xml
。 MyMojo
一个实例 - 完全初始化/配置,并正确注入所有组件和参数。 MyMojo
。 通过调试,我的意思是能够在断点(也是有条件的)上设置和暂停,在源代码中进/出/结束。
理想情况下,我希望能够执行executeMyMojoFrom(new File("pom.xml"))
- 例如在JUnit测试或某个类的main
方法中。 (我可以提供groupId
, artifactId
等所有其他定义应该从该pom.xml
加载。)
我怎样才能做到这一点?
我到目前为止所尝试的是:
Debug As...
on Eclipse中的pom.xml
- 不能很好地工作(找不到源代码,断点不工作,因为它不是Java项目上下文) 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
)。
更新
对评论中的问题几乎没有回答:
你的意思是你不想要这样的测试类,即MyMojoTest
与MyMojo
(即你的插件项目)驻留在同一个项目中? 这是为什么?
究竟。 我想在现有的Maven项目中调试插件执行,我不想将该项目首先移动到我的插件项目,以便能够运行测试。 我希望能够测试/调试现有项目。 理想情况下,我只需要在项目的src / test / MyMojoTest
中添加my-maven-plugin-testing
依赖项和子类MyMojoTest
。 这将是调试执行的好工具。 将目标项目拖到我的Mojo项目中开销太大 - 而且大多数情况下,这些并不是我想长期保持的测试用例。 我希望,这个答案,为什么。
无论如何,这仅仅是一个将project-to-test/pom.xml
在插件模块的src/test/resources
中的约定,而不是一个规则......
我的问题不project-to-test
的pom.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 Plugin
的copy-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
)
);
project
, session
和pluginManager
变量应通过正常的Mojo注入来注入。 是的,这意味着这应该从另一个Maven插件的上下文中执行。 现在我想,它是否会以任何方式帮助你仍然是一个问题,因为它仍然依赖于底层plexus
容器注入这些组件。
我最初的想法是,你要建立一个maven插件,通过上面的mojo-executor
来调用你的jaxb2
插件,然后序列化mavenProject
, mavenSession
, pluginManager
,即所有的plexus
注入组件,然后使用这些对象来调用你的jaxb2
插件在未来从一个独立的类没有你建立的插件。
上一篇: How to execute a specific plugin/Mojo from a pom.xml programmatically?