Maven maven-dependency-plugin copy-dependencies忽略outputDirectory

时间:2016-04-07 21:03:20

标签: maven maven-dependency-plugin

我尝试使用maven-dependency-plugin的copy-dependencies目标。 我使用下面的代码检查了its official example

我的问题是:依赖项总是被复制到 target\dependency文件夹,即使我指定了<outputDirectory>节点。

以下是我pom.xml的一部分:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.10</version>
            <executions>
              <execution>
                <id>copy-dependencies</id>
                <phase>package</phase>
                <goals>
                  <goal>copy-dependencies</goal>
                </goals>
              </execution>
                <configuration>
                      <outputDirectory>${project.build.directory}/aaa</outputDirectory>
                      <overWriteReleases>true</overWriteReleases>
                      <overWriteSnapshots>true</overWriteSnapshots>
                      <overWriteIfNewer>true</overWriteIfNewer>
                </configuration>                  
            </executions>
        </plugin>
    </plugins>
</build>

问题:我做错了什么?是否可以在项目外声明输出目录?例如:c:\temp

2 个答案:

答案 0 :(得分:3)

您使用仅在其范围内定义的配置配置了maven-dependency-plugin的执行,因此只有在mvn package调用期间插件才会执行该操作,即执行{{{ 1}}阶段和插件(执行)绑定它。

如果从命令行调用插件,如下所示:

package

它确实只会使用默认值,因为您的配置将被忽略。

实际上,outputDirectory选项的默认值确实是:

  

默认mvn dependency:copy-dependencies

在maven中,插件配置可以定义为一般配置(在${project.build.directory}/dependency部分之外,适用于所有执行和命令行调用)或每次执行(在execution部分内,如在你的情况下)。

在您的情况下,您可能希望配置在两种情况下都有效,因此只需将插件部分更改为以下内容:

execution

注意:我们提升了配置,从执行范围到插件(全局)范围。

另请注意,在上面的配置中我们保留了执行,这意味着maven将始终在每次<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.10</version> <configuration> <outputDirectory>${project.build.directory}/aaa</outputDirectory> <overWriteReleases>true</overWriteReleases> <overWriteSnapshots>true</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> </execution> </executions> </plugin> </plugins> </build> 调用时执行此插件目标。如果您不想要此行为并且只希望使用命令行执行,那么您可以删除mvn package部分。

答案 1 :(得分:0)

Since Maven 3.3.1 it's also possible(请参阅“使用执行标签”部分结尾处的注释):

  

从Maven 3.3.1开始,情况不再如此,因为您可以在命令行上指定直接插件目标调用的执行ID。

直接执行复制依赖关系执行而根本不修改pom:

mvn dependency:copy-dependencies@copy-dependencies

请注意,在用@分隔的两个副本依赖关系中,前者指的是插件目标,而后者指的是执行ID。通常,直接直接执行是:

mvn <plugin-prefix>:<goal>@<execution>

另请参阅accepted answer to almost the same question