2012-06-06 21 views
13

Próbuję użyć wtyczki maven-resources, aby wykonać filtrowanie przy użyciu celu kopiowania zasobów i uruchomić się następujący błąd:Błąd typu maven-resources-plugin przy użyciu celu kopiowania zasobów: brak zasobów lub brak parametru outputDirectory

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 

wyizolować problem, stworzyłem bardzo prosty pom.xml, kopiowane całkiem prawie dosłownie z http://maven.apache.org/plugins/maven-resources-plugin/examples/copy-resources.html, prowadził go i dostał ten sam błąd.

jestem powołując go

mvn resources:copy-resources 

jakieś pomysły? Oto 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> 

Odpowiedz

22

Głównym problemem jest to, że trzeba było jesteś powołując się na cel za pomocą wtyczki bezpośrednio

mvn resources:copy-resources 

które niekoniecznie utworzyć katalog wyjściowy. Zamiast tego wywołaj prawidłową fazę cyklu życia Maven.

mvn process-resources 

Pełną listę faz cyklu życia wystarczy uruchomić mvn polecenie bez niczego ..

Ogólnie prawie zawsze lepiej, aby wywołać fazy cyklu życia, a nie cel bezpośrednio, ponieważ gwarantuje, że wszelkie warunki wstępne są spełnione (np. nie można skompilować klas testowych przed testowanymi klasami).

+0

Hmm, prawda jesteś. Dzięki - jeszcze jeden mały krok na drodze do kompetencji Maven. –

+0

Po prostu uwaga: słuszne jest wywoływanie celu w pom w innej fazie, ale zazwyczaj nie należy uruchamiać celu nie-maven-life z zewnątrz! –

+0

@ childno.de co sprawia, że ​​tak mówisz? Imho, to nie jest poprawne. –

5

Sprawdź, czy @bmargulies odpowiedzieć działa dla Ciebie. Możesz zapoznać się z these examples.

W żadnym wypadku nie musisz używać <pluginManagement>, aby to osiągnąć. <pluginManagement> jest używany w scenariuszach wielomodułowych w celu ułatwienia dziedziczenia konfiguracji plugin.

Musisz przenieść element configuration z elementu execution. Poniższy fragment kodu działa.

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

Dzięki. Próbowałem to w obie strony (określając zasoby w '/' lub alternatywnie w '///'), i oba wydają się pracować równoważnie. Czy jest jakaś korzyść dla jednego z drugim? Ten ostatni przechowuje informacje w jednym miejscu w pom, co wydaje się nieco ładniejsze. –

+0

@AndyD. Dobre pytanie (być może uzasadnia oddzielne pytanie SO - tak, aby inni/bardziej kompetentni ludzie mogli odpowiedzieć?) Pierwsze z nich i tak używa 'wtyczki zasobów maven '. Niektóre przykłady na stronie wtyczki odnoszą się także do poprzedniego stylu! – Raghuram

+0

Doceniam informacje zwrotne i było to pomocne, ale przyznam Manfredowi zaakceptowaną odpowiedź, ponieważ właściwie zauważył, że nie musiałem mimo wszystko przestawiać konfiguracji z elementu wykonawczego; Musiałem odwołać się do fazy cyklu życia, a nie bezpośrednio do celu. –

0

Po prostu usuń egzekucje i ich konfigurację. Zwykle możesz chcieć zdefiniować zasoby w <build> > <resources> odpowiednio <build> > <testResources> (patrz) bezpośrednio poza konfiguracją wtyczki przy użyciu domyślnego cyklu życia process-(test-)resources, który jest automatycznie podpięty przez copy-(test-)resources.. Tak, to zły przykład na ich stronie!

Powiązane problemy