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

问题描述

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

  • Reactor -> 类型 pom
    • 全部 -> 输入 zip
    • 脚本 -> 输入 zip
    • 资源 -> 输入 zip
    • 前端 -> 输入 pom
    • JarFile -> 输入 jar

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

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

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

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

解决方法

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

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

问题 2: 有什么方法可以配置发布,以便我只需要发布 All 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>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...