为啥 Maven 使用提供的构建插件的 pom.xml?

Posted

技术标签:

【中文标题】为啥 Maven 使用提供的构建插件的 pom.xml?【英文标题】:Why does Maven use a pom.xml of a provided build plugin?为什么 Maven 使用提供的构建插件的 pom.xml? 【发布时间】:2019-08-14 12:31:01 【问题描述】:

我们确实有一个简单的 maven pom,比如

<project xmlns="http://maven.apache.org/POM/4.0.0">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.xy.project.z</groupId>
  <artifactId>client</artifactId>
  <packaging>pom</packaging>

  <build>
    <plugins>
      <plugin>
        <groupId>org.xy.maven</groupId>
        <artifactId>own-maven-plugin</artifactId>
        <version>1.19.0</version>
        <executions>...</executions>
      </plugin>
    </plugins>
  </build>
</project>

你可能猜到了own-maven-plugin是我们自己在另一个项目中创建的maven插件,并且有一个独立的版本。到目前为止没有问题。但是突然间(至少对我来说)提供的 pom 不再运行了。它停止了消息:

Caused by: org.eclipse.aether.transfer.ArtifactNotFoundException: Failure to find org.xy.projcect:a:bundle:1.0.7-SNAPSHOT in http://repo.local:8081/repository/maven-public/ was cached in the local repository, resolution will not be reattempted until the update interval of internal-repository has elapsed or updates are forced

发生了什么。我们创建了一个新版本的own-maven-plugin 这个插件一直是一个包含所有必要依赖项的胖罐子。现在我们所做的只是添加了另一个依赖项。

所以有两件事我不明白。

    为什么 maven 会尝试解析已创建的 jar 的所有依赖项,该 jar 在 build-plugins 中使用。

    为什么我删除.m2/org/xy/maven/own-maven-plugin/own-maven-plugin-1.19.0.pom后问题解决了@

这是可重现的,添加已删除的 pom 会使构建失败。我在 maven 插件 description site 上没有发现任何迹象表明我的问题。

所以如果有人有解释。请告诉我。

UPDATE-1: 更新错误信息

【问题讨论】:

请发布完整的错误消息输出,而不仅仅是摘录... 您可以使用 flatten 插件从 fatjar 中的依赖项中清除 pom.xml:mojohaus.org/flatten-maven-plugin/flatten-mojo.html#flattenMode 谢谢你不知道这个插件 【参考方案1】:

Maven 插件通常不构造为胖罐子。他们自己解决依赖关系。

如果你有一个在 pom 中包含依赖项的 fat jar,那么依赖项可能也会被解析,所以你有两次类:一次在 fat jar 中,一次在依赖项中。

我不能说这是否解释了你所有的错误,但我想如果你一开始就避免使用胖罐子,事情会更容易。

【讨论】:

感谢您的回答。我们首先创建 fat-jar 的原因是 jar 将用作 CLI 命令和 maven 插件。但为了测试,我们将删除它。 好的,目前我不认为 fat-jar 是问题的根源。但是删除它进行测试帮助我找到了问题。我仍然不明白所有细节的问题。【参考方案2】:

好的,找到问题的原因了。

新依赖本身包含一个依赖类型为 bundle 的依赖。

<dependency>
    <groupId>org.xy.maven</groupId>
    <artifactId>own-maven-plugin-dep</artifactId>
    <version>1.2.0</version>
    <type>bundle</bundle>
</dependency>

删除此类型后,它再次像魅力一样工作。 我不知道为什么首先添加了&lt;type&gt;bundle&lt;/type&gt;。但是我认为删除它没有任何缺点。

阅读this 中有关捆绑类型的信息对于理解为什么在此处删除解决了我的问题没有多大帮助。

此答案不包含该问题的所有答案。如果有人提供更好的答案,我非常乐意更改已接受的答案。

【讨论】:

以上是关于为啥 Maven 使用提供的构建插件的 pom.xml?的主要内容,如果未能解决你的问题,请参考以下文章

jenkins为啥只打印maven的构建日志,不显示项目启动日志?

直接拉取的jenkins镜像为啥没有maven

为啥ssm框架都要有maven管理呢,不用可以嘛,有啥优缺点?谢谢了!

为啥执行maven命令时,会首先链接远程仓库呢

使用提供的工件作为 Maven 插件依赖

Maven生命周期