2009-05-11 9 views
21

Chúng tôi có một giải pháp với nhiều cuộc chiến tranh. Chiến tranh là tương tự trong ý nghĩa tất cả họ đều sử dụng ngủ đông và mùa xuân. Điều này có nghĩa là chúng tôi có một số lọ giống nhau trong mỗi cuộc chiến. Điều này đang trở thành một vấn đề, bởi vì kích thước của tai đang bắt đầu tăng trưởng theo tỷ lệ.Làm thế nào để làm cho maven đặt tất cả các lọ chung cho các cuộc chiến tranh bên trong cùng một EAR đến gốc EAR?

Tôi muốn sử dụng Maven để tính toán các phụ thuộc và đặt tất cả các lọ chung cho nhiều cuộc chiến vào thư mục gốc của EAR.

Tôi đã cố gắng tổ chức dự án của mình bằng kiểu nguyên mẫu j2ee (maven-archetype-j2ee-simple), nhưng tất cả các cuộc chiến vẫn được đóng gói với các phụ thuộc bên trong WEB-INF/lib. Có cách nào để Maven tính toán các phụ thuộc chung và đặt chúng vào EAR, cũng như anh ta có thể tính toán tất cả các phụ thuộc chuyển tiếp khi xây dựng một cuộc chiến hay một cái bình?

Trả lời

8

Tạo một artifact mới có tên commons-lọ và gói nó như pom. Nó sẽ phụ thuộc vào tất cả các lọ thông thường bạn đang sử dụng - Spring, Hibernate, Log4j, v.v.

Sau đó, trong mỗi cuộc chiến, hãy thêm nó làm phụ thuộc với phạm vi "được cung cấp" (và đừng quên đặt loại như pom). Bạn sẽ có thể nhìn thấy nó trong classpath của bạn, nhưng họ sẽ không được đóng gói vào chiến tranh. Bằng cách này bạn cũng có thể có các phụ thuộc chiến tranh cụ thể được đóng gói vào nó, mà giải pháp từ skinny wars không cung cấp.

+0

Vì vậy, sau khi chúng ta tạo commons-jars.jar, chúng ta có nên thêm điều này vào 1) server/default/lib hoặc 2) root của tai không? – Rips

+2

KHÔNG phải là cách tốt nhất để đi, xem câu trả lời tiếp theo! – Christophe

+1

@toefel vui lòng xác định câu trả lời "tiếp theo". Câu trả lời của WHOM hoặc một liên kết sẽ hữu ích, bởi vì họ có thể chuyển đổi địa điểm dựa trên phiếu bầu. – Ben

4

Bạn có thể đặt dependancies scope thành "được cung cấp". Điều này có nghĩa là chúng sẽ được cung cấp bởi một số mô-đun khác và sẽ không được bao gồm trong lọ hoặc chiến tranh cuối cùng.

Có lẽ assembly plugin có thể giúp bạn khi đóng gói EAR cuối cùng và đặt các lọ chung ở đó.

4
+4

từ URL được đề xuất: "Bây giờ phần đau đớn. pom.xml của dự án EAR của bạn cần liệt kê mọi phụ thuộc mà WAR có. là vì Maven giả định các WAR chất béo và không bao gồm các phụ thuộc chuyển tiếp của các WAR trong EAR. " Tôi hỏi: Tôi muốn sử dụng Maven để tính toán các phụ thuộc ... mà không cần sử dụng Maven để tính toán các phụ thuộc, nó không phải là ... – Dan

+1

@Dan, đọc câu trả lời của Turbokiwi để biết cách tránh phần đau đớn một cách tuyệt vời :) –

59

Như bạn đã đề cập trong nhận xét, đó là nhiệm vụ của maven để tính toán mọi phụ thuộc. Khi bạn tạo ra một tạo tác, với mọi phụ thuộc chung, thì bạn cũng sẽ phải đoán, phụ thuộc nào ở đó. Cũng có thể có thể, bạn phải triển khai một cuộc chiến, với sự phụ thuộc của nó trên một máy khác mà không có tai, khi bạn đặt mọi phụ thuộc chiến tranh được cung cấp, thì bạn lại bị mắc kẹt lần nữa.

Cách duy nhất đúng, để có được cuộc chiến tranh gầy là từ các ví dụ: http://maven.apache.org/plugins/maven-war-plugin/examples/skinny-wars.html

Nhưng, và bây giờ đến phần thú vị, đó là một trong những lớn! phím tắt (mà hoàn toàn lấy đi nỗi đau được đề cập), để nói với maven, mà phụ thuộc WAR của bạn có.

Vào bên trong mô-đun EAR của bạn khai báo phụ thuộc thứ hai trên WAR với loại pom cho mỗi phụ thuộc WAR.

<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/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<parent> 
    <groupId>com.foo</groupId> 
    <artifactId>skinny</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 
<artifactId>ear</artifactId> 
<packaging>ear</packaging> 
<dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>war</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>war</type> 
    </dependency> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>war</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>pom</type> 
    </dependency> 
</dependencies> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-ear-plugin</artifactId> 
      <version>2.8</version> 
      <configuration> 
       <skinnyWars>true</skinnyWars> 
       <defaultLibBundleDir>lib</defaultLibBundleDir> 
       <modules> 
        <webModule> 
         <groupId>com.foo</groupId> 
         <artifactId>war</artifactId> 
        </webModule> 
       </modules> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Bây giờ, mỗi WAR sẽ được đóng gói một cách độc lập với sự phụ thuộc của riêng nó và EAR sẽ được đóng gói với Wars gầy và mỗi phụ thuộc bên trong thư mục lib

Cập nhật:

Hãy nhớ rằng thư mục ear/lib không thể được sử dụng cho mỗi jar phụ thuộc trong một Container nghiêm ngặt như JBoss EAP 6. Các thư viện thành phần JSF như tomahawk, các nguyên tố, v.v ... phải để lại e trong thư mục WEB-INF/lib.

Một cách thuận tiện để đạt được điều này với các giải pháp mô tả ở trên là làm cho một loại trừ cho các thư viện thành phần trong tai pom.xml như thế này:

... 
<dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>war</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>war</type> 
    </dependency> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>war</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>pom</type> 
     <exclusions> 
      <exclusion> 
       <groupId>org.primefaces</groupId> 
       <artifactId>primefaces</artifactId> 
      <exclusion> 
     </exclusions> 
    </dependency> 
</dependencies> 
... 

Bây giờ mỗi phụ thuộc của WAR sẽ được đặt trong ear/lib ngoại trừ thư viện thành phần sẽ được đặt trong WEB-INF/lib bên trong WAR

+5

Đây là một mẹo thực sự tuyệt vời. – Snekse

+4

Điều này *** thực sự *** cần ** TẤN ** upvotes hơn !! Tuyệt vời ! : D –

+1

NICE! :) điều này đã thực sự giúp tôi! – Christophe