Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以编程方式从pom.xml执行特定的插件/Mojo?_Java_Maven_Maven Plugin - Fatal编程技术网

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

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

我是一个Maven插件的作者(不是Apache/Codehaus,完全独立)。有时我会收到支持请求或测试用例,在这些请求或测试用例中,我确实需要使用现有的
pom.xml
调试插件的执行。基本上,我得到的测试用例是示例/测试项目(
pom.xml
with
src/main/resources
src/main/java
等等)

我需要的是一种方法:

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

理想情况下,我希望能够
executeMyMojoFrom(新文件(“pom.xml”)
——例如在JUnit测试或某个类的
main
方法中。(我可以提供
groupId
artifactId
等。所有其他定义都应该从该
pom.xml
加载)

我如何才能做到这一点?


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

  • Eclipse中
    pom.xml
    上的
    Debug As…
    不够好(找不到源代码,断点不工作,因为它不是Java项目上下文)
  • Maven Embedder/Invoker解决方案—通过CLI在单独的流程中生成内容。忘记断点,不进行调试
  • 使用
    mvnDebug
    进行远程调试,然后按照Pascal Thivent的建议从Eclipse进行远程调试。这是迄今为止最好的选择。然而,远程调试意味着分别启动
    mvnDebug
    ,而且也不能保证我在Eclipse中使用的JAR与
    mvnDebug
    使用的JAR完全相同。所以这里有一定的距离
  • -我真的认为这可以完成任务。但首先,我在篮球场上跳了几个小时,只是为了让比赛开始。所有重要的依赖项都是“提供”的,所以我首先必须找出这些工件版本的正确组合。然后-只发现它只在你想要测试的插件模块中起作用。当我认为
    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
插件,