2012-05-31 37 views
7

Tôi có thiết lập này hiện tại:Sửa đổi tài nguyên bên trong lớp phủ chiến tranh trong maven

Dự án A xuất ra tệp chiến tranh - có tệp cấu hình (WEB-INF/web.xml). Chúng tôi đã cung cấp điều này với một phần nhận xét ra khỏi cấu hình được uncommented bằng tay khi dự án được triển khai trong một môi trường cụ thể.

Nhu cầu của dự án đã thay đổi - và tôi cần Dự án A được xây dựng mà không có phần cấu hình đó hoàn toàn; và tôi cần một dự án khác (Dự án B) được xây dựng VỚI phần cấu hình đó (được bật, không bình luận). Thay vì có tệp tồn tại trong cả hai dự án (bảo trì kép), tôi đã hy vọng tôi có thể có Dự án B phụ thuộc vào Dự án A (qua lớp phủ chiến tranh), và sau đó sử dụng trình bổ trợ maven-config-plugin để thêm cấu hình đặc biệt cho WEB-INF/web.xml, sau đó đóng gói lại tệp chiến tranh.

Điều này dường như không hoạt động - mặc dù - sửa đổi cấu hình có thể hoạt động nếu mục tiêu đã tồn tại (tức là sau lần chạy trước), nhưng khi tôi chạy mọi thứ lại với nhau, lớp phủ và đóng gói lại vào cuộc chiến mới sẽ xảy ra cùng nhau - và tôi không thể tìm ra cách nào để làm cho plugin trình xử lý cấu hình hoạt động ở giữa. Về cơ bản, thứ tự mặc định kết thúc là "config-processor" (không thành công vì lớp phủ chưa xảy ra), sau đó "war" (tất cả là một đơn vị). Tôi không thể làm cho bộ xử lý cấu hình xảy ra sau lớp phủ nhưng trước khi chiến tranh được đóng gói hoàn toàn.

Nhiều người trên internet đã hỏi trong vài năm qua nếu có cách chèn plugin vào giữa "giải nén lớp phủ" và "lặp lại tệp chiến tranh", nhưng không ai có vẻ đã trả lời dứt khoát đường. Bất kỳ ý tưởng?

Trả lời

5

Kể từ khi lớp phủ chiến tranh và bao bì chiến tranh tất cả dường như xảy ra như một phần của một mục tiêu duy nhất, tôi không nghĩ rằng có một cách để có được ở giữa của nó. Để giải quyết vấn đề này, bạn có thể trích xuất web.xml trong giai đoạn trước và xử lý nó. Plugin maven-dependency có thể được sử dụng trong Project B để trích xuất web.xml từ Project A vào thư mục làm việc, sau đó chạy maven-config-processor-plugin trên web.xml và đặt kết quả ở một nơi khác, sau đó hướng dẫn maven-war-plugin đã xử lý web.xml trước các lớp phủ. Trong POM Dự án B:

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

Theo như tôi có thể nói, các plugin chiến tranh bao gồm webResources đầu tiên, tiếp theo là src/main/webapp, tiếp theo là lớp phủ.

Tôi không quen với trình xử lý maven-config-plugin, vì vậy tôi xin lỗi nếu cấu hình của tôi không chính xác.

+0

Cảm ơn! Làm việc như người ở. – M1EK

+0

Có thể nói điều này quá sớm. Nó không hoạt động ngay bây giờ; tài nguyên đã sửa đổi bị ghi đè bởi lớp phủ mặc dù nó cho biết nó đã bỏ qua nó. – M1EK

+0

Nhưng tài nguyên đã sửa đổi hiển thị đúng trong thư mục dựng tạm thời ('myconfig/build' trong câu trả lời của tôi)? – matts

4

Bạn có thể sử dụng unpack goal of maven-dependency-plugin để tìm nạp dự án A để nhận web.xml cục bộ, sau đó chuyển đổi nó và trỏ 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

Cảm ơn! Tin rằng điều này sẽ có hiệu quả; đã thử đề xuất đầu tiên trước tiên để họ nhận được tín dụng trả lời. – M1EK

+0

Tuyệt vời!Tôi đã thử phương pháp này và nó hoạt động. Tôi không biết rằng bạn có thể chỉ định tệp 'web.xml' trong' maven-war-plugin'. – Jens

Các vấn đề liên quan