Maven maven-dependency-plugin 复制依赖项忽略outputDirectory

问题描述 投票:0回答:3

我尝试使用 maven-dependency-plugin 的复制依赖项目标。 我用下面的代码片段检查了其官方示例

我的问题是:依赖项总是被复制到

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 maven-dependency-plugin
3个回答
3
投票

您配置了

maven-dependency-plugin
的执行,其配置仅在其范围内定义,因此插件只会在
mvn package
调用期间(即执行
package
阶段和插件时)拾取它(执行)与其有绑定。

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

mvn dependency:copy-dependencies

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

事实上,

outputDirectory
选项的默认值确实是:

默认

${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
部分。


0
投票

自 Maven 3.3.1 起,这也是可能的(请参阅使用执行标签部分最后的注释):

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

直接执行复制依赖项执行,根本不修改你的pom:

mvn dependency:copy-dependencies@copy-dependencies

请注意,在用@分隔的两个复制依赖项中,前者指的是插件目标,后者指的是执行id。而一般的直接调用执行是:

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

另请参阅几乎相同问题的已接受答案


0
投票

不存在时(即你在目录路径中犯了错误),maven也可能默认为目标/依赖项。

例如我在 Windows 环境中的路径中有双斜杠(例如 c:\directory\subdirectory ),并且 maven 没有任何错误,只是切换到默认目标/依赖位置。

是的,可以在项目之外声明输出目录(这正是我的情况)。

© www.soinside.com 2019 - 2024. All rights reserved.