【问题标题】:maven-resources-plugin error using copy-resources goal: 'resources', 'outputDirectory' missing or invalid使用复制资源目标的 maven-resources-plugin 错误:“resources”、“outputDirectory”丢失或无效
【发布时间】:2012-06-11 01:02:02
【问题描述】:

我正在尝试使用 maven-resources-plugin 使用 copy-resources 目标进行一些过滤,并遇到以下错误:

Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:2.5:copy-resources (default-cli) on project bar: The parameters 'resources', 'outputDirectory' for goal org.apache.maven.plugins:maven-resources-plugin:2.5:copy-resources are missing or invalid

为了隔离问题,我创建了一个非常简单的 pom.xml,几乎一字不差地从 http://maven.apache.org/plugins/maven-resources-plugin/examples/copy-resources.html 复制,运行它,得到了同样的错误。

我用

调用它
mvn resources:copy-resources

有什么想法吗?这是测试 pom.xml。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>foo</groupId>
  <artifactId>bar</artifactId>
  <version>1.0-SNAPSHOT</version>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.5</version>
        <executions>
          <execution>
            <id>copy-resources</id>
            <!-- here the phase you need -->
            <phase>validate</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>${basedir}/target/extra-resources</outputDirectory>
              <resources>          
                <resource>
                  <directory>src/non-packaged-resources</directory>
                  <filtering>true</filtering>
                </resource>
              </resources>              
            </configuration>            
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

【问题讨论】:

    标签: maven maven-resources-plugin


    【解决方案1】:

    只需删除执行及其配置。通常,您可能希望在 &lt;build&gt; &gt; &lt;resources&gt;&lt;build&gt; &gt; &lt;testResources&gt; 中定义资源(请参阅 http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html),而不是使用默认生命周期 process-(test-)resources 直接在插件配置中定义,该生命周期由 copy-(test-)resources. 自动挂钩。 是的,这是他们页面上的一个坏例子!

    【讨论】:

      【解决方案2】:

      您遇到的主要问题是您直接使用调用插件目标

      mvn resources:copy-resources
      

      这不一定会创建输出目录。而是调用正确的 Maven 生命周期阶段。

      mvn process-resources
      

      要获得生命周期阶段的完整列表,只需运行 mvn 命令即可。

      一般来说,调用生命周期阶段而不是直接调用目标几乎总是更好,因为它保证满足任何先决条件(例如,不能在要测试的类之前编译测试类......)。

      【讨论】:

      • 嗯,没错。谢谢——在我获得 Maven 能力的道路上又迈出了一步。
      • 请注意:在另一个阶段调用 pom 中的目标是正确的,但通常不应从外部运行非 maven 生命周期目标!
      • @childno.de 是什么让你这么说?恕我直言,这是不正确的。
      • 因为在大多数情况下没有设置 maven 项目,目标的结果对于大多数开发人员来说显然是可重现的。像这样的一些“默认”插件 copy-resources 会自动挂钩,但您可以(如问题中所述)添加额外的执行。这正是您所描述的,一个插件的目标,如果您单独运行它,它的工作方式会有所不同,但在生命周期中与之前的依赖阶段一起工作。
      • @ManfredMoser,如果他在执行配置中指定了验证阶段,他为什么要运行流程资源阶段来执行插件?
      【解决方案3】:

      检查@bmargulies 答案是否适合您。可以参考these examples

      在任何情况下,您都不需要使用&lt;pluginManagement&gt; 来实现这一点。 &lt;pluginManagement&gt;用于多模块场景,方便plugin配置的继承。

      您需要将configuration 移出execution 元素。以下 sn-p 有效。

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>foo</groupId>
        <artifactId>bar</artifactId>
        <version>1.0-SNAPSHOT</version>
        <build>
          <plugins>
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>2.5</version>
              <configuration>
                <outputDirectory>${basedir}/target/extra-resources</outputDirectory>
                <resources>          
              <resource>
                <directory>src/non-packaged-resources</directory>
                <filtering>true</filtering>
              </resource>
                </resources>              
              </configuration>            
              <executions>
                <execution>
                  <id>copy-resources</id>
                  <!-- here the phase you need -->
                  <phase>validate</phase>
                  <goals>
                    <goal>copy-resources</goal>
                  </goals>
                </execution>
              </executions>
            </plugin>
          </plugins>
        </build>
      </project>
      

      【讨论】:

      • 谢谢。我已经尝试过两种方式(在&lt;build&gt;/&lt;resources&gt;&lt;build&gt;/&lt;plugins&gt;/&lt;plugin&gt;/&lt;configuration&gt; 中指定资源),它们似乎都可以等效地工作。一个与另一个相比有什么优势吗?后者将信息保存在 pom 中的一个位置,这似乎更好一些。
      • @AndyD。好问题(也许需要一个单独的 SO 问题 - 以便其他/更有知识的人可以回答?)前者使用 maven resource plugin 无论如何。插件页面中的一些示例也参考了前一种样式!
      • 感谢您的反馈,它很有帮助,但我将接受的答案授予 Manfred,因为他正确地指出,毕竟我不需要将配置移出执行元素;我需要调用生命周期阶段而不是直接调用目标。
      • 我认为这是错误的。您可能会这样做,但这会影响插件处理的所有资源,因为配置不是单独执行的。在这种情况下,它应该做同样的事情。
      猜你喜欢
      • 2019-12-23
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 2018-02-18
      • 1970-01-01
      相关资源
      最近更新 更多