2012-06-06 14 views
13

Estoy tratando de usar el maven-resources-plugin para hacer un poco de filtrado usando el objetivo copy-resources, y ejecuté en el siguiente error:error maven-resources-plugin con el recurso copy-resources objetivo: 'resources', 'outputDirectory' falta o no es válido

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 

para aislar el problema, he creado un pom.xml muy simple, poco más o menos copiado textualmente de http://maven.apache.org/plugins/maven-resources-plugin/examples/copy-resources.html, corrió, y obtuve el mismo error.

estoy invocando con

mvn resources:copy-resources 

¿Alguna idea? Aquí está la prueba 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> 

Respuesta

22

El principal problema que tuvimos es que está invocando el objetivo plug-in directamente utilizando

mvn resources:copy-resources 

que no necesariamente crear el directorio de salida. En su lugar, llame a la fase de ciclo de vida Maven correcta.

mvn process-resources 

Para obtener una lista completa de las fases del ciclo de vida basta con ejecutar el comando mvn sin nada ..

En general, casi siempre mejor para invocar una fase del ciclo de vida más que una meta directamente, ya que garantiza que las condiciones previas se cumplen (p. ej., no compilan clases de prueba antes de las clases que se probarán).

+0

Hmm, cierto que eres. Gracias, un bebé más paso en mi camino hacia la competencia de Maven. –

+0

Solo una nota: es correcto llamar al objetivo en pom en otra fase, pero normalmente no debería ejecutar un objetivo de ciclo de vida no maven desde afuera. –

+0

@ childno.de ¿qué te hace decir eso? Imho eso no es correcto –

5

Comprobar si @bmargulies responder funciona para usted. Puede consultar these examples.

En cualquier caso, no necesita usar <pluginManagement> para lograrlo. <pluginManagement> se usa en escenarios de varios módulos para facilitar la herencia de las configuraciones plugin.

Debe mover el configuration del elemento execution. El siguiente fragmento funciona.

<?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> 
+1

Gracias. Lo he intentado de ambas formas (especificando los recursos en '/' o alternativamente en '///'), y ambos parecen funcionar de manera equivalente. ¿Hay alguna ventaja para uno contra el otro? Este último mantiene la información en un solo lugar en el pom, que parece algo más agradable. –

+0

@AndyD. Buena pregunta (quizás justifique una pregunta de SO por separado, para que otras personas más conocedoras puedan responder). El primero usa el 'complemento de recursos de maven' de todos modos. ¡Algunos ejemplos en la página del plugin también se refieren al estilo anterior! – Raghuram

+0

Agradezco los comentarios y fue útil, pero estoy otorgando la respuesta aceptada a Manfred, ya que señaló correctamente que, después de todo, no tenía que mover la configuración fuera del elemento de ejecución; Necesitaba invocar la fase del ciclo de vida en lugar del objetivo directamente. –

0

Simplemente elimine las ejecuciones y su configuración. Normalmente, es posible que desee definir los recursos en <build> > <resources> respectivamente <build> > <testResources> (consulte http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html) directamente en la configuración del complemento utilizando el ciclo de vida predeterminado process-(test-)resources que se engancha automáticamente en copy-(test-)resources.. Sí, ¡es un mal ejemplo en su página!

Cuestiones relacionadas