补充缺失的 POM 信息

注意:此功能是在 1.0-alpha-5 版本中添加的。

Maven 的一大优势是它允许您(用户)以最小的努力直接在其他人的工作上进行构建。例如,通过在您的 POM 中添加五行(或更少),您可以声明对其他库的依赖,并指示 Maven 在构建您自己的项目期间使用该库。由于库的 JAR 通常伴随着它自己的 POM,因此您的项目不需要提供所有直接依赖项使用的所有库的详尽列表。

但是,这种从依赖项中重用 POM 元数据的方法可能会受到依赖项 POM 的限制,该依赖项提供了有关其项目的不完整信息。虽然大多数 POM 提供了关于其依赖关系的相当准确的信息,但它们有时会遗漏一些对组装许可和依赖关系通知文件至关重要的信息。

例如,许多 Apache 发行版使用的模板根据其组织名称(和 URL)以及每个项目网站的 URL 组装项目依赖项列表。当依赖项 POM 缺少此信息时,远程资源插件呈现的依赖项通知文件可能无效。

为了弥补不完整的依赖 POM,您可以使用补充模型支持,在 1.0-alpha-5 版本中引入远程资源插件,并在 1.1 版本中进行了改进。

修复不完整的 POM:使用补充模型

对于那些您的项目的依赖项未列出组织名称、组织 URL、项目 URL 或法律声明文件所需的任何其他元数据的情况,远程资源插件允许您配置一系列补充模型。这些模型由一个或多个模型文件组成,每个模型文件包含一个或多个 POM 片段,这些片段可以合并到现有的依赖 POM 中,以补充那里提供的元数据。该插件使用 key groupId:artifactId将每个补充模型与应合并的依赖项 POM 匹配。

例如,假设您的项目的 POM 已声明以下两个依赖项:

    <dependency>
      <groupId>org.foo</groupId>
      <artifactId>missing-org-info</artifactId>
      <version>1</version>
    </dependency>
    <dependency>
      <groupId>org.foo</groupId>
      <artifactId>missing-project-url</artifactId>
      <version>1</version>
    </dependency>

现在假设您的项目需要在其分发中包含一个文件,该文件列出每个依赖项的组织和项目 URL,格式如下:

From: Apache Software Foundation (http://www.apache.org/)

 - Commons FOO (http://commons.apache.org/foo/) org.apache.commons.foo:foo:1
 - Commons BAR (http://commons.apache.org/bar/) org.apache.commons.bar:bar:1

但是,当您尝试为您的项目生成这些许可资源时,您很快就会了解到您的依赖项提供的 POM 并不总是包含此格式所需的所有信息。第一个依赖项缺少 POM 的组织元素提供的所有信息,第二个依赖项缺少项目特定的 URL(POM 的url元素)。

为了修复这些遗漏以生成资源,我们可以简单地提供一个包含缺失信息的补充模型文件。该文件位于src/main/appended-resources/supplemental-models.xml,看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<supplementalDataModels xmlns="http://maven.apache.org/supplemental-model/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xsi:schemaLocation="http://maven.apache.org/supplemental-model/1.0.0 https://maven.apache.org/xsd/supplemental-model-1.0.0.xsd">
  <supplement>
    <project>
      <groupId>org.foo</groupId>
      <artifactId>missing-org-info</artifactId>
      
      <organization>
        <name>FOO, Inc.</name>
        <url>http://www.foo.org/</url>
      </organization>
    </project>
  </supplement>
  <supplement>
    <project>
      <groupId>org.foo</groupId>
      <artifactId>missing-project-url</artifactId>
      
      <url>http://www.foo.org/projects/missing-project-url/</url>
    </project>
  </supplement>
</supplementalDataModels>

最后,我们告诉远程资源插件使用新的补充模型文件:

      <plugin>
        <artifactId>maven-remote-resources-plugin</artifactId>
        <version>1.7.0</version>
        <executions>
          <execution>
            <id>process-remote-resources</id>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <supplementalModels>
                <supplementalModel>supplemental-models.xml</supplementalModel>
              </supplementalModels>
              [...]
            </configuration>
          </execution>
        </executions>
      </plugin>

重新运行项目构建后,我们提供的补充信息将与依赖项 POM 中的元数据合并,提供足够的信息来完成依赖项列表。

发布和重用补充模型

注意:此功能是在 1.1 版中添加的。

上面的配置适用于需要解决其依赖项元数据中的缺陷的单个项目。但是,当您的组织想要在多个项目中使用这些相同的缺陷依赖项时会发生什么?我们刚刚检查的配置无法处理补充模型文件的重用。

为了解决这个缺点,Remote Resources Plugin 1.1 版引入了一个新参数:supplementalModelArtifacts。当与上面使用的supplementalModels参数结合使用时,这个新参数允许远程资源插件解析包含补充模型信息的工件,然后在这些工件中搜索supplementalModels列表中给出的路径。

为了使用这种机制使上述补充模型可重用,我们首先将它们发布在他们自己的项目中:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  
  <groupId>org.myco</groupId>
  <artifactId>dependency-resource-supplement</artifactId>
  <version>1</version>
</project>

请注意,这只是一个简单的、朴素的 JAR 工件。然后我们将上面的 POM 和supplemental-models.xml文件移动到一个单独的项目目录结构中:

|-- pom.xml
`-- src
    `-- main
        `-- resources
            `-- supplemental-models.xml

一旦我们安装了这个新项目,我们就可以从远程资源插件的配置中引用它,如下所示:

      <plugin>
        <artifactId>maven-remote-resources-plugin</artifactId>
        <version>1.7.0</version>
        <executions>
          <execution>
            <id>process-remote-resources</id>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <!-- Reference the supplemental-model artifact from above -->
              <supplementalModelArtifacts>
                <supplementalModelArtifact>org.myco:dependency-resource-supplement:1</supplementalModelArtifact>
              </supplementalModelArtifacts>

              <!-- Specify the path, relative to the JAR root, where the supplemental model file is located -->
              <supplementalModels>
                <supplementalModel>supplemental-models.xml</supplementalModel>
              </supplementalModels>
              [...]
            </configuration>
          </execution>
        </executions>
      </plugin>

一旦发布并部署了补充模型项目,任何数量的项目都可以使用它提供的补充信息。