2008-12-09 39 views
45

Tôi có một quả maven Maven sử dụng <packaging>war</packaging>. Nhưng trên thực tế, tôi không muốn xây dựng tập tin chiến tranh, tôi chỉ muốn tất cả các jars phụ thuộc được thu thập và một thư mục triển khai đầy đủ được tạo ra.Làm thế nào để Maven chạy chiến tranh: phát nổ nhưng không chiến tranh: chiến tranh

Vì vậy, tôi đang chạy mục tiêu war:exploded để tạo ra các thư mục triển khai:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <configuration> 
       <webappDirectory>target/${env}/deploy</webappDirectory> 
       <archiveClasses>true</archiveClasses> 
      </configuration> 
      <goals> 
       <goal>exploded</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Vấn đề là, các tập tin chiến tranh vẫn được xây dựng. Có cách đơn giản nào để có <packaging>war</packaging> thực hiện mục tiêu war:exploded thay vì chiến tranh: mục tiêu chiến tranh không?

Hoặc có cách nào khác đơn giản để thực hiện việc này không?

+1

Tệp chiến tranh vẫn được tạo, vậy thì sao? Tại sao lại là một vấn đề? –

+4

Tôi cho rằng đó là vì họ muốn tăng tốc độ xây dựng - ít nhất đó là lý do tại sao tôi sử dụng nó. Tôi có một ứng dụng mùa xuân cơ bản với maven, nhưng tôi đang làm việc với Google App Engine, được cấu hình để quét thư mục xây dựng chiến tranh đã bùng nổ, vì vậy để tôi thấy các thay đổi, tôi cần xây dựng cuộc chiến bùng nổ - thường xuyên. Bất kỳ cách nào để gọi tự động này bất cứ lúc nào bất kỳ tập tin trong dự án được thay đổi? – chrismarx

Trả lời

40

Theo builtin lifecycle bindings để đóng gói chiến tranh trong giai đoạn chiến tranh gói thầu: mojo chiến tranh được gọi.

Bạn có thể gọi giai đoạn trước 'chuẩn bị gói' - tất cả các hành động này sẽ được thực hiện và sau đó chiến tranh gọi mojo: nổ

mvn prepare-package war:exploded 

Kết quả sẽ được giống như bạn nhưng không có chiến tranh tạo ra.

+1

Nếu bạn thực sự thích điều này, bạn có thể đặt chiến tranh: phát nổ invocation vào pom ràng buộc với giai đoạn chuẩn bị gói. Nhưng bạn sẽ có một vấn đề nếu bạn cần maven để đi trước và chạy phần còn lại của các giai đoạn, vì vậy chuyển sang < bao bì> pom là tốt hơn. – bmargulies

+0

Tôi thấy điều này không thành công vì tôi đang cố gắng thực hiện FileInputStream.open trên thư mục 'classes'. Tuy nhiên chạy như hai lệnh riêng biệt làm việc 'mvn chuẩn bị gói' và sau đó' mvn chiến tranh: phát nổ 'ah maven bạn bí ẩn thú –

+0

điều này không hoạt động nếu bạn có một dự án chia thành nhiều lọ - họ sẽ cần phải được 'cài đặt' ed để đưa chúng vào bộ nhớ cache tĩnh của maven để chúng được chọn trong giai đoạn chuẩn bị gói. –

5

Cách duy nhất tôi có thể làm là sử dụng bao bì pom (hoặc tạo custom packaging) và ràng buộc các mục tiêu cần thiết từ chiến tranh đóng gói cho các giai đoạn liên quan của vòng đời. Nếu bạn đi cho bao bì pom bạn có thể sử dụng xác định chiến tranh: thực hiện chiến tranh trong một hồ sơ để cho phép bạn gói nó, nhưng bạn sẽ cần phải sử dụng build-helper-maven-plugin attach-artifact goal để đính kèm chiến tranh vào pom.

Lưu ý với phương pháp này nếu bạn muốn sử dụng bất kỳ quá trình xử lý chiến tranh cụ thể nào khác, điều này có thể gây ra sự cố cho bạn.

Các ràng buộc vòng đời cho bao bì chiến tranh được liệt kê trong Introduction to The Build Lifecycle (xem phần "Mặc định vòng đời - Đóng gói ejb/ejb3/jar/par/rar/war").

Để ràng buộc hành Plugin liên quan đến pom đóng gói bạn sẽ làm như sau:

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-resources-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>process-resources</id> 
      <phase>process-resources</phase> 
      <goals> 
      <goal>resources</goal> 
      </goal> 
     </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <artifactId>maven-compile-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>compile</id> 
      <phase>compile</phase> 
      <goals> 
      <goal>compile</goal> 
      </goal> 
     </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <artifactId>maven-resources-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>process-test-resources</id> 
      <phase>process-test-resources</phase> 
      <goals> 
      <goal>testResources</goal> 
      </goal> 
     </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>test</id> 
      <phase>test</phase> 
      <goals> 
      <goal>test</goal> 
      </goal> 
     </execution> 
     </executions> 
    </plugin> 
    <!-- package not wanted, install and deploy already defined for pom packaging--> 
    <!--define war:war execution in a profile in case it is needed--> 
+0

Đây là phương pháp chính xác. – bmargulies

63

Giải pháp khá đơn giản. Bạn cần phải ghi đè việc thực hiện mặc định của các plugin chiến tranh để vô hiệu hóa nó và thêm thực hiện riêng của bạn (ví phát nổ):

<pluginManagement> 
    <plugins> 
      <plugin><!-- don't pack the war --> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>default-war</id> 
         <phase>none</phase> 
        </execution> 
        <execution> 
         <id>war-exploded</id> 
         <phase>package</phase> 
         <goals> 
          <goal>exploded</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
    </plugins> 
</pluginManagement> 
+6

Đây là giải pháp đơn giản và dễ dàng nhất được đăng tại đây. – Ajax

+0

+1 để có cách tiếp cận sạch nhất –

+0

Có, đây có vẻ là câu trả lời hay nhất. Làm việc như một sự quyến rũ đối với tôi. :) –

5

Tôi muốn nâng cấp lên @ Michael Wyraz câu trả lời và chỉ bao gồm cài đặt skip thiết lập trong trường hợp nếu ai đó thực thi mvn clean install, hãy xây dựng trên mức cao nhất của dự án đa mô-đun và một mô-đun phụ là ứng dụng web.

này đứng bên trong mô-đun chiến tranh:

<profiles> 
    <profile> 
     <id>war_explode</id> 
     <build> 
      <pluginManagement> 
       <plugins> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-war-plugin</artifactId> 
         <version>2.6</version> 
         <executions> 
          <execution> 
           <id>default-war</id> 
           <phase>none</phase> 
          </execution> 
          <execution> 
           <id>war-exploded</id> 
           <phase>package</phase> 
           <goals> 
            <goal>exploded</goal> 
           </goals> 
          </execution> 
         </executions> 
        </plugin> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-install-plugin</artifactId> 
         <executions> 
          <execution> 
           <id>default-install</id> 
           <phase>none</phase> 
          </execution> 
         </executions> 
        </plugin> 
       </plugins> 
      </pluginManagement> 
     </build> 
    </profile> 
</profiles> 

Without cài đặt skip xây dựng không như nó cố gắng để cài đặt chiến tranh vào thư mục .m2.Thông báo lỗi như sau:

[INFO] --- maven-install-plugin:2.4:install (default-install) @ *** --- 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:install (default-install) on project ***: The packaging for this project did not assign a file to the build artifact -> [Help 1] 

Thi mvn clean install -P war_explode với các thiết lập này (kèm theo trong hồ sơ maven tên war_explode) nó sẽ hoàn thành xây dựng mà không có lỗi.

+1

Nếu cài đặt thất bại đó là chính xác bởi vì không có gì được cài đặt, nhưng điều này là fakely giả vờ nó được thực hiện. Có lẽ nó là tốt hơn làm hồ sơ cho nổ và chiến tranh bao bì, nơi hồ sơ phát nổ không cho cài đặt một cách chính xác. –

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