使用已发布的工件时,Maven 依赖项解析如何工作?

Posted

技术标签:

【中文标题】使用已发布的工件时,Maven 依赖项解析如何工作?【英文标题】:How does Maven dependency resolution work when using released artifacts? 【发布时间】:2021-04-06 15:07:15 【问题描述】:

我有一个多模块 Maven 项目,如下所示:

反应器 -> 类型 pom 全部 -> 输入 zip 脚本 -> 输入 zip 资源 -> 输入 zip 前端 -> 输入 pom JarFile -> 输入 jar

最终,当我将它打包发布时,这个库的使用者应该需要的唯一依赖项是:

全部(在构建时嵌入脚本、资源、JarFile 和前端的文件) JarFile(如果他们想针对此 Jar 中定义的公共 Java API 进行开发,将使用它)

我注意到,如果我只部署 All 和 JarFile,并且只将这两个依赖项添加到消费项目并构建我的消费项目,我会收到 maven 构建错误,提示找不到脚本、资源和前端(因为它们被引用由所有人的pom)

    当直接使用 All 工件时(在其构建状态下),为什么 Maven 会关心它是否无法解析 All pom 的依赖项?这些应该是 All 项目的实施细节吗? 有什么方法可以配置发布,这样我只需要发布所有 zip 和 JarFile jar 工件吗?而不是这些“实现细节”工件?

【问题讨论】:

【参考方案1】:

Q1:直接使用 All 工件时(在其构建状态下),为什么 Maven 会关心它是否无法解析 All pom 的依赖项?这些应该是 All 项目的实施细节吗?

Maven 3 解决依赖关系 transitively 按设计

Q2:有什么方法可以配置发布,这样我只需要发布所有 zip 和 JarFile jar 工件吗?而不是这些“实现细节”工件?

是的,您可以使用flatten-maven-plugin 在发布之前使用usage 页面上描述的配置来展平POM:

  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>flatten-maven-plugin</artifactId>
        <!--<version>1.2.2</version>-->
        <configuration>
          <flattenMode>minimum</flattenMode>
        </configuration>
        <executions>
          <!-- enable flattening -->
          <execution>
            <id>flatten</id>
            <phase>process-resources</phase>
            <goals>
              <goal>flatten</goal>
            </goals>
          </execution>
          <!-- ensure proper cleanup -->
          <execution>
            <id>flatten.clean</id>
            <phase>clean</phase>
            <goals>
              <goal>clean</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

【讨论】:

以上是关于使用已发布的工件时,Maven 依赖项解析如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

创建发布版本后如何管理 Maven 依赖工件

maven警告:使用同一工件的两种不同类型的依赖项时重复版本

如何解决具有不同包装常春藤类型的sbt中的依赖关系?

如何通过Gradle将所有依赖项复制到Maven存储库?

如何防止 Maven 为我的仓库中已有的工件下载 maven-metadata.xml?

Selenium - Maven 依赖项 - 无法读取工件描述符