我是其中一个Maven插件的作者(不是Apache / Codehaus,完全独立)。有时我得到支持请求或测试用例,我真的需要用现有的pom.xml
来调试我的插件的执行。基本上我得到的测试用例是样本/测试项目(pom.xml
src/main/resoures
,src/main/java
等等。
我需要的是一种方法:
pom.xml
。MyMojo
的实例 - 完全初始化/配置,并注入所有组件和参数。MyMojo
。通过调试我的意思是能够设置和暂停断点(也是有条件的),进入/退出/覆盖源代码。
理想情况下,我希望能够executeMyMojoFrom(new File("pom.xml"))
- 例如在某个类的JUnit测试或main
方法中。 (我可以提供groupId
,artifactId
等。所有其他定义应该只从pom.xml
加载。)
我如何实现这一目标?
到目前为止我已尝试过:
Debug As...
上的pom.xml
- 效果不佳(找不到源代码,断点不是因为它不是Java项目上下文)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
中一样)。
更新
评论中的问题几乎没有答案:
你的意思是你不想要这样的测试类,即
MyMojoTest
和MyMojo
一样驻留在同一个项目中,即你的插件项目?那是为什么?
完全。我想在现有的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)源代码未附加"出于某种原因。
答案 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
)
);
,project
和session
变量。是的,这意味着这应该从另一个maven插件的上下文执行。现在我想一想,这是否会以任何方式帮助你仍然是一个问题,因为这仍然依赖于底层pluginManager
容器注入这些组件。
我最初的想法是让你构建一个maven插件,通过上面的plexus
调用你的jaxb2
插件,然后序列化mojo-executor
,mavenProject
, mavenSession
,即所有pluginManager
注入的组件,然后使用这些对象将来从没有您构建的插件的独立类调用您的plexus
插件。