用法

关于如何使用依赖目标的简要示例:

dependency:copy

此目标旨在绑定到生命周期阶段并在您的pom.xml. 它将从存储库中解析工件并将副本放置在指定位置。可以在一次执行中定义多个工件。指定了默认输出目录,但可以通过设置可选的 outputDirectory 字段为每个 ArtifactItem 覆盖。可以将可选的新名称设置为重命名或复制时剥离的版本。

工件版本是可选的。如果未设置,插件将尝试从项目依赖项中解析它,然后是依赖项管理部分。

有关如何处理覆盖的规则,请参阅覆盖规则部分。

如果您打算将插件绑定到与您的构建一起执行,请像这样配置插件:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.3.0</version>
        <executions>
          <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>[ groupId ]</groupId>
                  <artifactId>[ artifactId ]</artifactId>
                  <version>[ version ]</version>
                  <type>[ packaging ]</type>
                  <classifier> [classifier - optional] </classifier>
                  <overWrite>[ true or false ]</overWrite>
                  <outputDirectory>[ output directory ]</outputDirectory>
                  <destFileName>[ filename ]</destFileName>
                </artifactItem>
              </artifactItems>
              <!-- other configurations here -->
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

如果您打算将此目标配置为在命令行上执行,请使用:

mvn dependency:copy

您不能将配置放在executions标签内。您的配置应如下所示:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
          <artifactItems>
            <artifactItem>
              <groupId>[ groupId ]</groupId>
              <artifactId>[ artifactId ]</artifactId>
              <version>[ version ]</version>
              <type>[ packaging ]</type>
              <classifier> [classifier - optional] </classifier>
              <overWrite>[ true or false ]</overWrite>
              <outputDirectory>[ output directory ]</outputDirectory>
              <destFileName>[ filename ]</destFileName>
            </artifactItem>
          </artifactItems>
          <!-- other configurations here -->
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

笔记:

  • 默认情况下,使用 Maven 工件文件名约定(即artifactId-version-classifier.type )将工件复制到outputDirectory中。使用以下规则覆盖默认约定:
    • 使用artifactItem.destFileName覆盖默认文件名。
    • 使用stripVersion从默认文件名中删除版本。设置artifactId.destFileName时忽略此字段。
    • 使用artifactItem.outputDirectory覆盖每个artifactItem插件的outputDirectory配置。

dependency:copy-dependencies

此目标可以绑定到生命周期阶段并在您的pom.xml. 它将从存储库中解析依赖项(包括传递依赖项)并将副本放置在指定位置。

工件可以根据类型放置在子文件夹中。例如:

\输出目录

\输出目录\罐子

\输出目录\战争

可以将工件放置在每个工件的子文件夹中。例如:\outputDirectory\junit-junit-3.8.1
此功能也适用于每种类型的子文件夹。例如:\outputDirectory\jars\junit-junit-3.8.1\

工件也可以通过指定分类器和可选类型来解决。类型仅与分类器一起使用,默认为 java-sources。当分类器被设置时,依赖列表被用作使用分类器和类型解析工件的基础。例如:mvn dependency:copy-dependencies -Dclassifier=sources将尝试查找所有依赖项的来源并复制它们。

还包括按类型(war、jar 等)、范围(运行时、测试等)、分类器(jdk14、源等)、groupId、artifactId 或它们的组合来包含或排除的能力。

注意:从 2.0-alpha-5 开始,您可以混合使用同一类别(即范围)的包含和排除。包含在排除之前处理​​。

有关如何处理覆盖的规则,请参阅覆盖规则部分。

也可以从命令行启动目标,例如:mvn dependency:copy-dependencies [optional params]

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.3.0</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <!-- configure the plugin here -->
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

dependency:unpack

此目标旨在绑定到生命周期并在您的 pom.xml 中进行配置。它将从存储库中解析工件并将副本放置在指定位置。可以在一次执行中定义多个工件。指定了默认的 outputDirectory,但可以通过设置可选的 outputDirectory 字段为每个 ArtifactItem 覆盖。

如果为每个 artifactItem 定义了不同的包含/排除参数,则可以多次解压单个工件

有关如何处理覆盖的规则,请参阅覆盖规则部分。

工件版本是可选的。如果未设置,插件将尝试从项目依赖项中解析它,然后是依赖项管理部分。

如果您打算将插件绑定到与您的构建一起执行,请像这样配置插件:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.3.0</version>
        <executions>
          <execution>
            <id>unpack</id>
            <phase>package</phase>
            <goals>
              <goal>unpack</goal>
            </goals>
            <configuration>
              <!-- configure the plugin here -->
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

如果您打算将此目标配置为在命令行上执行,请使用:

mvn dependency:unpack

您不能将配置放在executions标签内。您的配置应如下所示:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
          <artifactItems>
            <artifactItem>
              <groupId>[ groupId ]</groupId>
              <artifactId>[ artifactId ]</artifactId>
              <version>[ version ]</version>
              <type>[ packaging ]</type>
              <classifier> [classifier - optional] </classifier>
              <overWrite>[ true or false ]</overWrite>
              <outputDirectory>[ output directory ]</outputDirectory>
              <includes>[ comma separated list of file filters ]</includes>
              <excludes>[ comma separated list of file filters ]</excludes>
            </artifactItem>
          </artifactItems>
          <!-- other configurations here -->
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

dependency:unpack-dependencies

这个目标可以绑定到一个生命周期并在你的 pom.xml 中配置。它将从存储库中解析依赖项(包括传递依赖项)并将它们解包到指定位置。

Unpack-dependencies 默认包含传递依赖。要仅包括直接依赖项,请将 excludeTransitive 参数设置为 true。

依赖关系可以通过类型列表包含或排除。有关详细信息,请参阅解包依赖项

可以根据类型将工件解压缩到子文件夹中。例如:

\输出目录

\输出目录\罐子

\输出目录\战争

可以将工件放置在每个工件的子文件夹中。例如:\outputDirectory\junit-junit-3.8.1
此功能也适用于每种类型的子文件夹。例如:\outputDirectory\jars\junit-junit-3.8.1\

工件也可以通过指定分类器和可选类型来解决。类型仅与分类器一起使用,默认为 java-sources。当分类器被设置时,依赖列表被用作使用分类器和类型解析工件的基础。例如:mvn dependency:unpack-dependencies -Dclassifier=sources将尝试查找所有依赖项的源并解压缩它们。

可以根据需要应用过滤器以包含或排除某些文件或文件集

还包括按类型(war、jar 等)、范围(运行时、测试等)、分类器(jdk14、源等)、groupId、artifactId 或它们的组合来包含或排除的能力。

注意:从 2.0-alpha-5 开始,您可以混合使用同一类别(即范围)的包含和排除。包含在排除之前处理​​。

有关如何处理覆盖的规则,请参阅覆盖规则部分。

也可以从命令行启动目标,例如:mvn dependency:unpack-dependencies [optional params]

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.3.0</version>
        <executions>
          <execution>
            <id>unpack-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
              <!-- configure the plugin here -->
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

覆盖规则

使用以下规则复制或解包工件:

  • 如果目标中不存在工件,则复制/解压缩它。

    否则:

  • 仅用于复制/解包目标:如果artifactItem / overWriteoroverWrite为真,那么它将强制覆盖。
  • 释放检查overWriteReleases值(默认 = false)。如果为真,那么它将强制覆盖。
  • 快照检查overWriteSnapshots值(默认 = false)。如果为真,那么它将强制覆盖。
  • 如果以上均未设置为 true,则默认为该overWriteIfNewer值 (default = true)。如果该值为 true,则仅当源比目标更新(或目标中不存在)时,插件才会复制。(对于解包,这将检查在markersDirectory路径中创建的标记文件是否存在。为避免 之后的意外行为mvn clean,此路径通常应包含在/target层次结构中。)

例子:

  • 使用默认设置(overWriteReleases= false、overWriteSnapshots= false、overWriteIfNewer= true),只有当源比目标(或解包时的标记文件)更新时,发布或快照工件才会覆盖目标。
  • 如果overWriteReleases= true,则发布工件(即foo-1.0.jar)将始终覆盖。
  • 如果overWriteSnapshots= true,则快照工件(即foo-1.0-SNAPSHOT.jar)将始终覆盖。
  • 如果所有值都为 false,则仅当目标中不存在复制/解包(或markersDirectory解包)时才会发生复制/解包。

dependency:resolve

Resolve 旨在从命令行使用,例如:mvn dependency:resolve -Dsilent=true

这个目标只是告诉 maven 解析所有测试范围(包括编译)依赖项,然后显示解析的版本。这旨在帮助确保将所有依赖项下载到本地存储库。这在故障排除或间歇性远程存储库故障时非常有用,因为重复构建多项目模块是不可取的,并且构建在依赖关系解析上失败。它还可用于快速确定版本的解析方式。

工件也可以通过指定分类器和可选类型来解决。类型仅与分类器一起使用,默认为 java-sources。当分类器被设置时,依赖列表被用作使用分类器和类型来解析工件的基础。例如:mvn dependency:resolve -Dclassifer=test-jar将尝试查找所有依赖项的 test-jar 并将它们解析到本地存储库。

dependency:sources

源旨在从命令行使用,例如:mvn dependency:sources -Dsilent=true

这与解析目标相同,只是它包括源附件(如果存在)。当您要将源附件下载到本地存储库时,这很有用。

您还markersDirectory可以在 pom 或 settings 中将其定义为所有项目的公共位置。这允许系统更快地解析没有发布源的依赖项的源。该插件将存储一个标记文件来描述源是否已解析。通过将它们放置在一个公共位置,可以避免多次尝试解析不存在的源。

dependency:resolve-plugins

Resolve-plugins 旨在从命令行使用,例如:mvn dependency:resolve-plugins -Dsilent=true -DexcludeTransitive=true

这与 resolve 目标相同,只是它解析插件和可选的依赖项。

dependency:go-offline

这个目标与调用完全相同mvn dependency:resolve dependency:resolve-plugins

dependency:purge-local-repository

此目标旨在从本地存储库中删除当前项目(或项目,在多模块构建的情况下)的所有依赖项。可以使用各种限制参数运行清除,包括工件排除、仅限于直接依赖项以及不同级别的删除深度。默认情况下,删除的工件可以在之后重新解决;您可以通过指定来禁用它-DreResolve=false

以最简单的形式,可以这样调用目标:

mvn dependency:purge-local-repository

要添加不删除工件的限制org.apache.maven:maven-plugin-api,我们可以将命令修改为:

mvn dependency:purge-local-repository -Dexclude=org.apache.maven:maven-plugin-api

注意:exclude参数是以逗号分隔的 groupId:artifactId 对列表。它有一个对应的基于列表的参数——excludes方便在POM内部使用。

这个目标的另一个方便的方面是能够消除不同深度的伪影。这些深度是:

  • file - 仅删除工件的文件。
  • version - 删除包含此工件的版本目录。金额为file.getParentFile()
  • artifactId - 删除包含此工件的 artifactId 目录。金额为file.getParentFile().getParentFile()
  • groupId - 删除包含此工件的 groupId 目录结构。

    至少,这相当于file.getParentFile().getParentFile().getParentFile()。但是,如果 groupId 包含多个部分,则目标将修剪所有仅包含与此工件关联的文件的 groupId-part 目录。同样,请注意,此修剪算法的例外是最低的 groupId 部分,它将始终被修剪。

要将依赖项工件修剪回其关联的 artifactId 目录(例如,为了验证正确的工件解析),只需使用以下命令:

mvn dependency:purge-local-repository -DresolutionFuzziness=artifactId

最后,可以将此目标绑定到构建生命周期。这样做的一个原因可能是在初始化构建时清除所有依赖项,以验证正确的解决方案。

dependency:analyze

此目标执行字节码分析以确定丢失或未使用的依赖项。这个目标是从命令行启动的。它将分叉构建并执行测试编译,因此有类文件要分析。如果要在 pom 中绑定分析,请dependency:analyze-only改用。

这个目标可以从命令行执行:

mvn dependency:analyze

样本输出:

[INFO] [dependency:analyze]
[WARNING] Used undeclared dependencies found:
[WARNING]    classworlds:classworlds:jar:1.1-alpha-2:compile
[WARNING]    org.apache.maven.shared:maven-invoker:jar:2.0.7-SNAPSHOT:test

dependency:analyze-dep-mgt

此目标在最终解决后查看依赖项,并在您的 dependencyManagement 部分中查找不匹配项。在 2.0.6 之前的 maven 版本中,可以继承与您的 dependencyManagement 不匹配的版本。有关详细信息,请参阅MNG-1577

如果此目标检测到问题,您应该在升级到 2.0.6 之前尝试解决差异以避免任何意外。这可以通过升级或降级 dependencyManagement 中的版本以匹配运行时实际包含的版本来完成,或者您可以在项目中指定一个依赖项以覆盖所包含的内容。您可以通过重新运行此目标来检查结果。如果您决定使用依赖项进行覆盖,请务必记下它,以便在升级到 2.0.6 后将其删除。您还可以使用 dependency:analyze 目标来发现这个未使用的直接依赖关系。

此目标对于仅检测直接覆盖dependencyManagement 的项目也很有用。将 ignoreDirect 设置为 false 以检测这些正常情况。

这个目标可以从命令行执行:

mvn dependency:analyze-dep-mgt

样本输出:

[INFO] Found Resolved Dependency / DependencyManagement mismatches:
[INFO]  Dependency: commons-lang:commons-lang:jar
[INFO]          DepMgt  : 1.0
[INFO]          Resolved: 2.3
[INFO]  Dependency: commons-digester:commons-digester:jar
[INFO]          DepMgt  : 1.6
[INFO]          Resolved: 1.7
[INFO]  Dependency: javax.servlet:servlet-api:jar
[INFO]          DepMgt  : 2.3
[INFO]          Resolved: 2.4
[WARNING] Potential problems found in Dependency Management

dependency:analyze-report

此目标用于在maven-site-plugin.

 <reporting>
   <plugins>
    ...
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>3.3.0</version>
      <reportSets>
        <reportSet>
          <reports>
            <report>analyze-report</report>
          </reports>
        </reportSet>
      </reportSets>
    </plugin>
   </plugins>
 </reporting>

dependency:tree

此目标用于查看当前正在构建的项目的依赖层次结构。它将输出 Maven 构建过程实际使用的已解析依赖树。

这个目标可以从命令行执行:

mvn dependency:tree

或者,output可以指定参数以将输出转移到文件:

mvn dependency:tree -DoutputFile=/path/to/file

此外,该outputType参数可用于生成不同格式的输出。当前支持以下格式:

mvn dependency:tree -DoutputFile=/path/to/file.graphml -DoutputType=graphml

dependency:build-classpath

自:2.0-alpha-2

此目标将从本地存储库输出依赖项的类路径字符串到文件或日志,并可选择附加和部署文件。例如,该文件将包含一个类路径字符串,如下所示:

/home/foo/.m2/repository/org/java/utils/util/util-1.0.jar:/home/foo/.m2/ ....

然后可以像这样使用生成的文件:

java -cp `cat resultFile` MyClass

在最简单的形式中,要将类路径输出到日志,可以这样调用目标:

mvn dependency:build-classpath

或将类路径写入 cp.txt。:

mvn dependency:build-classpath -Dmdep.outputFile=cp.txt

目标也可以通过以下配置绑定到生命周期阶段:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.3.0</version>
        <executions>
          <execution>
            <id>build-classpath</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>build-classpath</goal>
            </goals>
            <configuration>
              <!-- configure the plugin here -->
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

dependency:list-repositories

此目标用于列出此构建所依赖的所有存储库。它将显示在您的设置、pom 中定义并在传递依赖 pom 中声明的存储库。

dependency:get

此目标用于使用其 Maven 坐标从远程存储库中获取工件和(可选)其依赖项。

mvn dependency:get -DgroupId=org.apache.maven -DartifactId=maven-core -Dversion=2.2.1 -Dpackaging=jar -Dclassifier=sources -DremoteRepositories=central::default::https://repo.maven.apache.org/maven2,myrepo::::http://myrepo.com/maven2
mvn dependency:get -DgroupId=org.apache.maven -DartifactId=maven-core -Dversion=2.2.1 -Dpackaging=jar -Dclassifier=sources -DremoteRepositories=https://repo.maven.apache.org/maven2 
mvn dependency:get -Dartifact=org.apache.maven:maven-core:2.2.1:jar:sources -DremoteRepositories=https://repo.maven.apache.org/maven2 -Ddest=/tmp/myfile.jar