2012-05-31 23 views
7

mam tej konfiguracji obecnie:Modyfikowanie zasobów wewnątrz nakładki wojennej w Maven

Projekt A wyprowadza plik war - ma plik konfiguracyjny (WEB-INF/web.xml). Dostarczamy to z zakomentowaną sekcją konfiguracji, która zostanie odkomentowana ręcznie, gdy projekt zostanie wdrożony w określonym środowisku.

Potrzeby projektu uległy zmianie - i potrzebuję, aby Projekt A był całkowicie zbudowany bez tej części konfiguracji; i potrzebuję innego projektu (Projekt B), który zostanie zbudowany Z tą sekcją konfiguracji (włączoną, nieskomunikowaną).

Zamiast posiadania pliku w obu projektach (podwójna konserwacja), miałem nadzieję, że projekt B będzie zależał od Projektu A (przez nakładkę wojenną), a następnie użyj wtyczki procesora maven-config, aby dodać mój specjalną konfigurację do WEB-INF/web.xml, a następnie ponownie spakuj plik wojny.

Nie wydaje się to działać - choć - modyfikacja konfiguracji może zadziałać, jeśli cel już istnieje (tj. Po poprzednim uruchomieniu), ale kiedy wszystko wykonam razem, nakładka i przepakowywanie do nowej wojny dzieje się razem - i nie mogę wymyślić żadnego sposobu, aby wtyczka konfiguracji procesora działała w środku. Zasadniczo domyślna kolejność kończy się na "procesorze konfiguracyjnym" (który nie działa, ponieważ nakładka jeszcze się nie wydarzyła), a następnie "wojnie" (wszystkie jako jedna jednostka). Nie mogę sprawić, by procesor konfiguracyjny zdarzył się po nakładce, ale przed wojną jest w pełni zapakowany.

Wiele osób w Internecie zapytało w ciągu ostatnich kilku lat, czy istnieje sposób na wstrzyknięcie wtyczki pomiędzy kroki "rozpakuj nakładkę" i "zapakuj plik wojenny", ale nikt nie odpowiedział definitywnie na to pytanie. droga. Jakieś pomysły?

Odpowiedz

5

Ponieważ nakładki wojenne i pakowanie wojenne zdają się być częścią jednego celu, nie sądzę, że istnieje sposób, aby się w nim znaleźć. Aby obejść ten problem, można wydobyć web.xml we wcześniejszej fazie i przetworzyć go. Wtyczka zależna od znacznika może być użyta w Projekcie B, aby wyodrębnić web.xml z Projektu A do katalogu roboczego, następnie uruchomić wtyczkę procesora maven-config na web.xml i umieścić wynik gdzie indziej, a następnie polecić włączenie wtyczki maven-war do wtyczki który przetworzył web.xml przed nakładkami. W Projekt B za POM:

<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <version>2.4</version> 
     <executions> 
      <!-- Extract web.xml from Project A --> 
      <execution> 
       <id>unpack-webxml</id> 
       <phase>generate-resources</phase> 
       <goals> 
        <goal>unpack</goal> 
       </goals> 
       <configuration> 
        <artifactItems> 
         <artifactItem> 
          <groupId>your.group</groupId> 
          <artifactId>project.a</artifactId> 
          <version>...</version> 
          <type>war</type> 
          <overWrite>true</overWrite> 
          <outputDirectory>${project.build.directory}/myconfig/work</outputDirectory> 
          <includes>WEB-INF/web.xml</includes> 
         </artifactItem> 
        </artifactItems> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <groupId>com.google.code.maven-config-processor-plugin</groupId> 
     <artifactId>maven-config-processor-plugin</artifactId> 
     <version>2.0</version> 
     <executions> 
      <!-- Process extracted web.xml and place in temp build directory --> 
      <execution> 
       <id>process-webxml</id> 
       <goals> 
        <goal>process</goal> 
       </goals> 
       <configuration> 
        <outputDirectory>${project.build.directory}/myconfig/build</outputDirectory> 
        <transformations> 
         <transformation> 
          <input>${project.build.directory}/myconfig/work/WEB-INF/web.xml</input> 
          <output>WEB-INF/web.xml</output> 
          <!-- your transformation config --> 
         </transformation> 
        </transformations> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.1.1</version> 
     <configuration> 
      <webResources> 
       <!-- Instruct war plugin to include temp build directory in webapp --> 
       <resource> 
        <directory>${project.build.directory}/myconfig/build</directory> 
        <includes> 
         <include>**</include> 
        </includes> 
       </resource> 
      </webResources> 
      <overlays> 
       <!-- Overlay customization if needed --> 
      </overlays> 
     </configuration> 
    </plugin> 
</plugins> 

miarę mogę powiedzieć, wtyczka wojna obejmuje webResources najpierw, a następnie src/main/webapp, a następnie nakładek.

Nie znam wtyczki procesora-maven-config, więc przepraszam, jeśli moja konfiguracja nie jest poprawna.

+0

Dzięki! Pracował jak urok. – M1EK

+0

Może powiedziałem to za wcześnie. Teraz nie działa; zmodyfikowany zasób zostanie nadpisany przez nakładkę, mimo że wskazuje, że go pominął. – M1EK

+0

Ale zmodyfikowany zasób pojawia się poprawnie w katalogu budowania tymczasowego ('myconfig/build' w mojej odpowiedzi)? – matts

4

Możesz użyć unpack goal of maven-dependency-plugin, aby pobrać projekt A, aby uzyskać lokalnie plik web.xml, a następnie przekształcić go i wskazać na maven-war-plugin to transformed web.xml.

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.4</version> 
      <executions> 
       <execution> 
       <id>unpack</id> 
       <phase>generate-resources</phase> 
       <goals> 
        <goal>unpack</goal> 
       </goals> 
       <configuration> 
        <artifactItems> 
        <artifactItem> 
         <groupId>org.test</groupId> 
         <artifactId>test-war1</artifactId> 
         <version>0.0.1-SNAPSHOT</version> 
         <type>war</type> 
        </artifactItem>   
        </artifactItems> 
        <outputDirectory>${project.build.directory}/wars</outputDirectory> 
       </configuration> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <groupId>com.google.code.maven-config-processor-plugin</groupId> 
      <artifactId>maven-config-processor-plugin</artifactId> 
      <version>2.0</version> 
      <configuration> 
       <!-- 
        configure to transform file 
        ${project.build.directory}/wars/WEB-INF/web.xml 
        into 
        ${project.build.directory}/transformed/web.xml 
       --> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>process</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
       <warSourceDirectory>src/main/webapp</warSourceDirectory> 
       <webXml>${project.build.directory}/transformed/web.xml</webXml> 
      </configuration> 
     </plugin> 
    </plugins> 
    </build> 
+0

Dzięki! Uwierzcie, że to by zadziałało; najpierw wypróbowali pierwszą sugestię, więc dostali odpowiedź. – M1EK

+0

Świetnie!Próbowałem tego podejścia i działa. Nie wiedziałem, że możesz określić plik 'web.xml' w' maven-war-plugin'. – Jens

Powiązane problemy