2012-06-06 9 views
13

Ich versuche das maven-resources-plugin zu verwenden, um eine Filterung mit dem Ziel copy-resources durchzuführen, und ran in den folgenden Fehler:maven-resources-plugin Fehler unter Verwendung von copy-resources Ziel: 'resources', 'outputDirectory' fehlt oder ungültig

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 

das Problem zu isolieren, habe ich eine sehr einfache pom.xml, ziemlich fast wörtlich aus http://maven.apache.org/plugins/maven-resources-plugin/examples/copy-resources.html kopiert, lief es, und bekam den gleichen Fehler.

Ich Aufruf mit

mvn resources:copy-resources 

Irgendwelche Ideen? Hier ist der Test 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> 

Antwort

22

Das Hauptproblem Sie ist hatte, dass das Plugin Ziel direkt

mvn resources:copy-resources 

verwenden aufrufen, das nicht notwendigerweise das Ausgabeverzeichnis erstellen. Rufen Sie stattdessen die korrekte Maven-Lebenszyklusphase auf.

mvn process-resources 

Eine vollständige Liste der Lebenszyklus-Phasen nur, ohne etwas zu den mvn Befehl ausführen ..

Im Allgemeinen ist es fast immer besser, eine Phase des Lebenszyklus eher als ein Ziel direkt aufrufen, da es gewährleistet, dass alle Voraussetzungen erfüllt sind (z. B. können Testklassen vor den zu testenden Klassen nicht kompiliert werden.).

+0

Hmm, das bist du. Danke - noch ein Baby Schritt auf dem Weg zu Maven Kompetenz. –

+0

Nur eine Anmerkung: Es ist korrekt, das Ziel in Pom in einer anderen Phase zu nennen, aber Sie sollten normalerweise kein Nicht-Maven-Lifecycle-Ziel von Outer ausführen! –

+0

@ childno.de was sagst du dazu? Imho das ist nicht korrekt. –

5

Überprüfen Sie, ob @bmargulies beantworten für Sie arbeitet. Sie können sich auf these examples beziehen.

In jedem Fall müssen Sie <pluginManagement> nicht verwenden, um dies zu erreichen. <pluginManagement> wird in Multi-Modul-Szenarien verwendet, um die Vererbung von plugin Konfigurationen zu erleichtern.

Sie müssen das configuration aus execution Element verschieben. Das folgende Snippet funktioniert.

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

Danke. Ich habe es in beiden Richtungen versucht (Angabe der Ressourcen in '/' oder alternativ in '///'), und sie scheinen beide gleichwertig zu arbeiten. Gibt es einen Vorteil gegenüber dem anderen? Letzterer hält die Information an einem Ort im Pom, was etwas schöner erscheint. –

+0

@AndyD. Gute Frage (vielleicht eine separate SO-Frage - so dass andere/mehr sachkundige Leute darauf antworten können?) Der erste benutzt sowieso 'maven resource plugin'. Einige Beispiele auf der Plugin-Seite beziehen sich auch auf den früheren Stil! – Raghuram

+0

Ich schätze das Feedback, und es war hilfreich, aber ich gebe Manfred die akzeptierte Antwort, als er richtig bemerkte, dass ich die Konfiguration nicht aus dem Ausführungselement herausbewegen musste; Ich musste die Lebenszyklusphase anstatt direkt auf das Ziel anwenden. –

0

Entfernen Sie einfach die Ausführungen und ihre Konfiguration. Normalerweise möchten Sie möglicherweise Ressourcen in <build> > <resources> bzw. <build> > <testResources> (siehe http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html) direkt nicht in der Plugin-Konfiguration mit dem Standardlebenszyklus process-(test-)resources definieren, der automatisch von copy-(test-)resources. angehängt wird. Ja, es ist ein schlechtes Beispiel auf ihrer Seite!