gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:26 25 4
gpt4 key购买 nike

我是其中一个 Maven 插件(不是 Apache/Codehaus,完全独立的)的作者。有时我会收到支持请求或测试用例,我真的需要使用现有的 pom.xml 来调试我的插件的执行。 .基本上我得到的测试用例是样本/测试项目( pom.xmlsrc/main/resouressrc/main/java 等等)。

我需要的是一种方法:

  • 加载现有 pom.xml .
  • 在那里找到我的插件的特定执行(通常是唯一的)。
  • 获取 MyMojo 的实例- 完全初始化/配置,正确注入(inject)所有组件和参数。
  • 执行 MyMojo .
  • 重要的是测试项目是独立的项目,我不想将它们复制到我的插件的 Maven 模块中。
  • 我希望能够在没有远程调试的情况下做到这一点。

  • 通过调试,我的意思是能够设置和暂停断点(也是有条件的),单步执行/退出/跳过源代码。

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

    我怎样才能做到这一点?

    到目前为止我尝试过的:
  • Debug As...pom.xml在 Eclipse 中 - 效果不佳(未找到源代码,断点不起作用,因为它不是 Java 项目上下文)
  • Maven Embedder/Invoker 解决方案 - 通过 CLI 在单独的进程中生成事物。忘记断点,没有调试。
  • 使用 mvnDebug 进行远程调试然后按照 Pascal Thivent 的建议从 Eclipse 进行远程调试 here .这是迄今为止最好的选择。但是,远程调试意味着启动mvnDebug单独,并且也不能保证我在 Eclipse 中的 JAR 与 mvnDebug 完全相同。正在使用。所以这里有一定的距离。
  • maven-plugin-testing-harness - 我实际上认为这可以完成任务。但首先我跳了几个小时的篮球只是为了让它开始。所有重要的依赖项都是“提供”的,所以我首先必须找出这些 Artifact 版本的正确组合。然后 - 才发现 AbstractMojoTestCase 仅适用于您要测试的插件模块。当我认为maven-plugin-testing-harness时可能我错了是 Maven 插件的测试工具。它似乎是该插件模块中插件的测试工具。这不是不合逻辑,但对我的情况没有帮助。我想在其他模块中测试我的插件。

  • 所以现在我使用远程调试解决方案获得了最好的结果。但我正在寻找的东西真的很像 maven-plugin-testing-harness但不是硬连线到插件模块。有没有人碰巧有一个提示,如果这样的方法存在于 Maven Artifact 中的某个地方?

    更具体地说,我想写一些类似的东西:
     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 中一样)。

    更新

    评论中的几个问题的答案:

    You mean you don't want such a test class, i.e MyMojoTest to reside inside the same project as the MyMojo, i.e your plugin project? Why is that?



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

    Anyway, it's merely a convention to keep the project-to-test/pom.xml inside the src/test/resources of your plugin module, not a rule...



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

    And I'm not sure why Debug as... didn't help you...



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

    最佳答案

    如果Debug as对您没有效果,您可以尝试使用 mojo-executor有一点工作。

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

    这就是你将如何执行 copy-dependencies Maven Dependency Plugin的目标以编程方式:

    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 注入(inject)来注入(inject)。是的,这意味着这应该从另一个 maven 插件的上下文中执行。现在想想,这是否会以任何方式帮助你仍然是一个问题,因为这仍然依赖于底层 plexus 注入(inject)这些组件。容器。

    我最初的想法是让你构建一个 maven 插件来调用你的 jaxb2插件通过 mojo-executor像上面一样,然后序列化 mavenProject , mavenSession , pluginManager ,即所有 plexus注入(inject)的组件,然后使用这些对象来调用您的 jaxb2将来从一个独立的类中添加插件,没有你构建的插件。

    关于java - 如何以编程方式从 pom.xml 执行特定的插件/Mojo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27463711/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com