Java 如何以编程方式从pom.xml执行特定的插件/Mojo?
我是一个Maven插件的作者(不是Apache/Codehaus,完全独立)。有时我会收到支持请求或测试用例,在这些请求或测试用例中,我确实需要使用现有的Java 如何以编程方式从pom.xml执行特定的插件/Mojo?,java,maven,maven-plugin,Java,Maven,Maven Plugin,我是一个Maven插件的作者(不是Apache/Codehaus,完全独立)。有时我会收到支持请求或测试用例,在这些请求或测试用例中,我确实需要使用现有的pom.xml调试插件的执行。基本上,我得到的测试用例是示例/测试项目(pom.xmlwithsrc/main/resources,src/main/java等等) 我需要的是一种方法: 加载现有的pom.xml 在那里找到我的插件的具体执行(通常它是唯一的) 获取一个MyMojo-完全初始化/配置的实例,并正确注入所有组件和参数 执行MyM
pom.xml
调试插件的执行。基本上,我得到的测试用例是示例/测试项目(pom.xml
withsrc/main/resources
,src/main/java
等等)
我需要的是一种方法:
- 加载现有的
pom.xml
- 在那里找到我的插件的具体执行(通常它是唯一的)
- 获取一个
-完全初始化/配置的实例,并正确注入所有组件和参数MyMojo
- 执行
MyMojo
- 重要的是,测试项目是独立的项目,我不想将它们复制到插件的Maven模块中
- 我希望能够做到这一点,而无需远程调试
executeMyMojoFrom(新文件(“pom.xml”)
——例如在JUnit测试或某个类的main
方法中。(我可以提供groupId
,artifactId
等。所有其他定义都应该从该pom.xml
加载)
我如何才能做到这一点?
到目前为止,我所尝试的:
- Eclipse中
上的pom.xml
不够好(找不到源代码,断点不工作,因为它不是Java项目上下文)Debug As…
- Maven Embedder/Invoker解决方案—通过CLI在单独的流程中生成内容。忘记断点,不进行调试
- 使用
进行远程调试,然后按照Pascal Thivent的建议从Eclipse进行远程调试。这是迄今为止最好的选择。然而,远程调试意味着分别启动mvnDebug
,而且也不能保证我在Eclipse中使用的JAR与mvnDebug
使用的JAR完全相同。所以这里有一定的距离mvnDebug
- -我真的认为这可以完成任务。但首先,我在篮球场上跳了几个小时,只是为了让比赛开始。所有重要的依赖项都是“提供”的,所以我首先必须找出这些工件版本的正确组合。然后-只发现它只在你想要测试的插件模块中起作用。当我认为
是maven插件的测试线束时,我可能错了。这似乎是插件模块中插件的测试线束。这不是不合逻辑的,但对我的情况没有帮助。我想在其他模块中测试我的插件maven插件测试线束
maven插件测试线束的东西
,而不是硬连线到插件模块。如果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插件测试线束中一样)
更新
对于评论中的问题,答案很少:
你的意思是你不希望这样一个测试类,即MyMojoTest
与MyMojo
驻留在同一个项目中,即你的插件项目?为什么呢
没错。我想调试现有Maven项目中的插件执行,我不想首先将该项目移动到我的插件项目,以便能够运行测试。我希望能够测试/调试现有项目。理想情况下,我只需要在项目的src/test/jaca中添加mymaven插件测试
依赖项和子类MyMojoTest
。这将是调试执行的好工具。将目标项目拖到我的Mojo项目中的开销太大了——而且大多数情况下,这些并不是我想要长期保存的测试用例。我希望,这回答了为什么
无论如何,这只是一种惯例,将要测试的项目/pom.xml
放在插件模块的src/test/resources
中,而不是一条规则
我的问题不是要测试的项目的pom.xml
的位置,这很容易配置。我的困难在于,maven插件测试工具
被硬编码到Mojo的项目中。它使用Mojo的pom.xml
,在包含的项目中查找其他特殊文件/描述符。所以我不能在非Mojo项目中使用它,或者我可以吗?这是我的问题
我不知道为什么调试为…
对您没有帮助
也不确定,但(1)断点不起作用,(2)源代码由于某种原因未“附加”。如果调试as
对您的效果不理想,您可以尝试使用mojo executor
这就是如何以编程方式执行Maven依赖插件的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执行器调用你的jaxb2
插件,