dependency:copy 在命令行中使用的 mojo 和在 pom 文件中配置相同的插件作为构建插件有什么区别

What's the difference between dependency:copy mojo used in command line and configured same pulgin in pom file as build plugin

我想找到 io.airlift:node:0.112 的所有依赖项,下载最小文件:

  1. 使用命令 %M2_HOME%/bin/mvn dependency:copy -Dmdep.outputScope=true -DincludeScope=compile -DincludeParents=true -DoutputFile="F:\temp\mytemp5" -DexcludeTransitive=true -f "F:\maven-plugins\node-0.112.pom",正在下载org.apache.maven.scm:maven-scm-provider-gitexe:1.8.1 .

  2. 如果我创建一个虚拟 pom 并依赖于 node-0.112,然后 运行 在虚拟 pom 上执行相同的命令,它不会下载 org.apache.maven.scm:maven-scm-provider-gitexe:1.8.1。下面是我的 pom 文件:

    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>dummy</groupId>
      <artifactId>dummy</artifactId>
      <version>1.0</version>
      <packaging>pom</packaging>
      <dependencies>
        <dependency>
         <groupId>io.airlift</groupId>
         <artifactId>node</artifactId>
         <version>0.112</version>
         <type>pom</type>
        </dependency>
       </dependencies>
       <build>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-dependency-plugin</artifactId>
              <version>2.8</version>
              <executions>
                <execution>
                  <id>copy-dependencies</id>
                  <phase>package</phase>
                  <goals>
                    <goal>copy-dependencies</goal>
                  </goals>
                  <configuration>
                    <addParentPoms>true</addParentPoms>
                    <copyPom>true</copyPom>
                    <outputDirectory>.</outputDirectory>
                    <excludeTransitive>false</excludeTransitive>
                    <useRepositoryLayout>true</useRepositoryLayout>
                    <includeScope>compile</includeScope>
                  </configuration>
                </execution>
              </executions>
            </plugin>
          </plugins>
        </build>
      </project>
    

另外 org.apache.maven.scm:maven-scm-provider-gitexe:1.8.1 甚至没有作为两种方法的依赖项返回。

为什么 maven 试图下载这个额外的插件?在不下载额外插件的情况下找到依赖项的最佳方法是什么?

io.airlift:node:0.112 pom 中有以下几行:

<scm>
  <connection>scm:git:git://github.com/airlift/airlift.git</connection>
  <developerConnection>scm:git:git@github.com:airlift/airlift.git</developerConnection>
  <url>https://github.com/airlift/airlift/tree/master</url>
  <tag>0.112</tag>
</scm>

SCM 代表 Software Configuration Management,它基本上是定义作者如何维护其来源的 pom 部分。有关详细信息,请参阅 link

So, the executable is this; there's not much at that link but you can take a look. 这会导致下载 org.apache.maven.scm:maven-scm-provider-gitexe:1.8.1 以促进项目与其 git 存储库的连接。它不依赖于项目本身,但它 依赖于项目的维护方式 - 通过使用 git 进行版本控制。

因此,如果您执行 mvn dependency:copy,它将下载 gitexe,但是如果您创建一个 没有 定义 git scm(事实上,根本没有定义任何 SCM),那么它不会下载可执行文件。