【问题标题】:Copy maven plugin from dependency with type pom使用 pom 类型从依赖项中复制 maven 插件
【发布时间】:2017-10-24 13:11:00
【问题描述】:

我的项目 A 包含以下依赖项:

    <dependency>
        <groupId>vo.cjm.modules.shared</groupId>
        <artifactId>basic</artifactId>
        <version>1.0.0</version>
        <type>pom</type>
    </dependency>

在这个依赖项的 pom 中,我配置了一个插件。但是,在 maven 本地 repo 中安装项目时,永远不会执行此插件。将插件移动到项目A的pom时,执行。

与继承插件的父子maven项目相比,在这里我发现自己处于仅继承依赖项的情况。是不是在使用 pom 类型的时候,只有依赖被继承,没有插件?如果是,如何实现在没有父子结构的maven中继承插件?

我也尝试过使用父项目。在这个项目中,我定义了子模块项目 A。在项目 A 中,我引用了父项目。执行此操作时,maven 会生成“重复版本”错误/警告。消除这种行为的唯一方法是删除项目 A 的版本。现在,项目 A 的版本是从父项目继承的。我希望能够独立管理项目 A 的版本,所以这不是一个选项。

我也尝试使用父项目,并在其中定义一个模块(项目 A)。但是,这仅适用于您将始终在父项目上调用 maven 的假设。在项目 A 上运行 maven,不会继承父项目中的任何内容。

【问题讨论】:

  • 我试图回答你的问题,但在我看来,背后可能隐藏着另一个问题。为什么你不想使用父子机制来继承你的插件?是不是像“如果我在父级中定义一个插件,所有子级都将继承,但我只希望这几个项目继承”之类的问题?
  • “孩子”需要自己的版本控制...我想独立构建我的孩子。 Maven 使用自上而下的方法,这意味着您应该始终调用父项目。我不想要这种方法......在子模块中添加父标签时,maven抱怨你有重复的版本......你应该只使用父标签之一。因此,子模块依赖于父模块。我想要颠倒层次结构。 =)
  • 使用 Maven,您绝对可以独立地版本和构建您的孩子。如果 Maven 抱怨重复的插件版本,这可能是一个配置问题。确切的问题和错误信息是什么?如果您在父项中定义了 并且在您的子项中的 下再次定义了它们,那么您可能做错了。如果你想在子级继承插件,你应该在你的父级中使用 。但这超出了您最初问题的范围,请随时对其进行编辑以准确解决您的问题,或者可能需要询问另一个问题;)
  • 试试这个基本的 maven 设置(我使用的是 3.5):只需在父模块中添加一个模块。在模块中引用父级。在模块中,maven 将生成有关重复版本编号的警告/错误...删除模块中的父引用,将使模块工作并拥有自己的版本,但是由于调用了模块本身,因此没有从父级继承任何内容:)无论如何,我用更多细节编辑了我的问题。 ;)
  • 感谢您提供详细信息,您能否提供导致错误的两个项目(您的父母和孩子)的相关 pom.xml? (我们会追根究底!)

标签: maven-3 pom.xml maven-plugin


【解决方案1】:

你要区分父子机制和依赖机制。

  • 当为 pom 指定父级(从而成为子 pom)时,您将继承在 &lt;dependencies&gt;&lt;plugins&gt; 元素中声明的所有依赖项和插件,等等
  • 当使用 &lt;dependencies&gt; 在 pom 中引用依赖项时,您是在告诉 Maven “我的项目中需要这个工件(jar、pom、其他),以及这个工件也依赖的任何其他依赖项”,但与此依赖项使用的插件无关。插件仅在使用 Maven 构建某些东西时使用。一旦构建了工件并可用,就没有理由包含该工件在构建时使用的插件 - 想象一下,如果对于您使用的每个依赖项,您都有大量的插件,您可能不希望突然添加到您的构建中!

是不是在使用pom类型的时候,只继承依赖没有插件?

是的。当你的依赖是 pom 类型时,你只是告诉 Maven 把这个 pom 的所有依赖添加到当前的 pom 中。

如果是,在没有父子结构的情况下,如何实现在maven中继承插件?

据我所知,你不能。如果要继承插件,则必须使用父 pom。

【讨论】:

    【解决方案2】:

    我会说依赖不是 Maven 项目对象模型的一部分,所以我会说不。

    我们正在使用父子架构来重用来自父母的插件。

    我们省略了将它们用作快照

    parent with plugins +
                        |
                        + another parent with plugins +
                        |                             |
                        |                             + child artifact uses plugins
                        + child artifact uses plugins
    

    等等。

    因此,父母可以例如定义一个 Java 版本,或者他们可以包含子项目可以使用的配置文件。

    这些不是反应器项目(没有“模块”),只是简单的 POM 项目,原因如下:为孩子提供插件、配置文件和依赖管理。

    【讨论】:

    • 你的意思是插件不是maven项目对象模型的一部分??
    • 对不起,如果我的回答导致混淆 - 它们是 POM 的一部分,但不能通过依赖项继承,只能通过父 POM。 POM 由父/子架构组成,但依赖项只是工件。也许这个页面能比我解释得更详细:maven.apache.org/pom.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 2021-09-28
    相关资源
    最近更新 更多