Maven maven-dependency-plugin copy-dependencies 忽略 outputDirectory
Maven maven-dependency-plugin copy-dependencies ignores outputDirectory
我正在尝试使用 maven-dependency-plugin 的复制依赖目标。
我用下面的代码片段检查了 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
?
您使用仅在其范围内定义的配置配置了 maven-dependency-plugin
的执行,因此它只会在 mvn package
调用期间被插件拾取,即在执行package
阶段和与其绑定的插件(执行)。
如果您从命令行调用插件如下:
mvn dependency:copy-dependencies
它确实只会使用默认值,因为您的配置将被忽略。
事实上,outputDirectory
选项的默认值确实是:
Default: ${project.build.directory}/dependency
在 maven 中,插件配置可以定义为通用配置(在 execution
部分之外,应用于所有执行和命令行调用)或每次执行(在 execution
部分内,就像你的情况一样)。
在您的情况下,您可能希望配置在这两种情况下都有效,因此只需将您的插件部分更改为以下内容:
<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>
注意:我们向上移动了配置,从执行范围到插件(全局)范围。
另请注意,在上面的配置中我们保留了执行,这意味着 Maven 将始终在每次 mvn package
调用时执行此插件目标。如果您不希望出现这种行为并且只想使用命令行执行,那么您可以完全删除 executions
部分。
Since Maven 3.3.1 it's also possible(请参阅使用执行标记部分末尾的注释):
Since Maven 3.3.1 this is not the case anymore as you can specify on the command line the execution id for direct plugin goal invocation.
直接执行copy-dependencies执行,根本不修改你的pom:
mvn dependency:copy-dependencies@copy-dependencies
注意用@隔开的两个copy-dependencies,前者指的是插件目标,后者指的是执行id。一般直接调用一个执行是:
mvn <plugin-prefix>:<goal>@<execution>
另见
我正在尝试使用 maven-dependency-plugin 的复制依赖目标。 我用下面的代码片段检查了 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
?
您使用仅在其范围内定义的配置配置了 maven-dependency-plugin
的执行,因此它只会在 mvn package
调用期间被插件拾取,即在执行package
阶段和与其绑定的插件(执行)。
如果您从命令行调用插件如下:
mvn dependency:copy-dependencies
它确实只会使用默认值,因为您的配置将被忽略。
事实上,outputDirectory
选项的默认值确实是:
Default:
${project.build.directory}/dependency
在 maven 中,插件配置可以定义为通用配置(在 execution
部分之外,应用于所有执行和命令行调用)或每次执行(在 execution
部分内,就像你的情况一样)。
在您的情况下,您可能希望配置在这两种情况下都有效,因此只需将您的插件部分更改为以下内容:
<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>
注意:我们向上移动了配置,从执行范围到插件(全局)范围。
另请注意,在上面的配置中我们保留了执行,这意味着 Maven 将始终在每次 mvn package
调用时执行此插件目标。如果您不希望出现这种行为并且只想使用命令行执行,那么您可以完全删除 executions
部分。
Since Maven 3.3.1 it's also possible(请参阅使用执行标记部分末尾的注释):
Since Maven 3.3.1 this is not the case anymore as you can specify on the command line the execution id for direct plugin goal invocation.
直接执行copy-dependencies执行,根本不修改你的pom:
mvn dependency:copy-dependencies@copy-dependencies
注意用@隔开的两个copy-dependencies,前者指的是插件目标,后者指的是执行id。一般直接调用一个执行是:
mvn <plugin-prefix>:<goal>@<execution>
另见