2009-10-07 33 views
10

Trong công ty của chúng tôi, chúng tôi có một số mô-đun khác nhau được xây dựng dưới dạng các cuộc chiến tranh riêng biệt. Mỗi khách hàng có thể chọn và chọn mô-đun mình muốn mua. Vì tất cả các mô-đun chia sẻ cùng một phiên, ngữ cảnh bảo mật vv, nên hợp nhất chúng thành một cuộc chiến duy nhất.Làm cách nào để kết hợp các cuộc chiến tranh thành một?

Có thể tự động hoá quy trình này không? Ví dụ, nó sẽ hợp nhất web.xml, tính toán từng phụ thuộc vào cuộc chiến, sao chép các tệp như .jsp và .class vv Bằng cách này, chúng tôi đang sử dụng Maven, nhưng không thể tìm ra giải pháp cho vấn đề này.

Trả lời

7

Cấp rủi ro được đề cập bởi djna và ChssPly76, bạn có thể có thể đạt được điều này bằng cách sử dụng lớp phủ với Maven WAR plugin. Điều này sẽ yêu cầu bạn tách ra các ánh xạ servlet để đảm bảo bạn không có bất kỳ xung đột URL nào và tương tự, nhưng nó có thể thực hiện thủ thuật.

Về cơ bản, bạn tạo mô-đun có nhiều phụ thuộc WAR và sử dụng plugin để hợp nhất chúng thành một mô-đun mới.

+0

Điều đó phù hợp với hầu hết tất cả các tệp (không phải clashin g) đến từ các cuộc chiến tranh webapp khác nhau. Bạn có biết cách kết hợp các tệp web.xml khác nhau không? –

1

Rõ ràng là có thể làm được điều này, nhưng tôi nghĩ rằng bạn nên làm việc tốt hơn trên một WAR duy nhất ngay từ đầu. Cuối "pick-and-mix" của WAR nội dung sounbds như một cơn ác mộng hỗ trợ cho tôi.

+1

Nếu khách hàng không mua mô-đun, sau đó tôi không muốn phân phối mô-đun cho khách hàng (và khu nghỉ mát để ẩn nó ..). Ngoài ra, chiến tranh như vậy sẽ rất lớn - điều đó sẽ rất không thực tế cho các mục đích phát triển, vv .. – Dan

0

Nói chung - không, điều đó là không thể. Nếu bạn có tên JSP trùng lặp thì sao? Tên/ánh xạ Servlet? Trình nghe ngữ cảnh tương tự tải với các tham số khác nhau (phổ biến nếu bạn đang sử dụng Spring/Struts/etc ...)? Bạn sẽ có được điểm.

Trong trường hợp cụ thể của bạn, có thể hoặc không thể thực hiện tùy thuộc vào hoàn cảnh cụ thể của bạn. Trích xuất chiến tranh và sao chép JSP/lớp/thư viện dễ dàng hơn; việc hợp nhất web.xml phức tạp hơn một chút vì bạn phải duy trì thứ tự phần tử - có thể dễ dàng xác định một tệp web.xml "đã hợp nhất" theo cách thủ công.

+0

Tôi sẽ rất vui khi có công cụ hủy bỏ nếu có bất kỳ xung đột nào được phát hiện. – Dan

+0

Tôi nghĩ rằng một chính sách có thể xử lý những xung đột tên đó (lớp phủ sử dụng chính sách "thắng đầu tiên", mặc dù "chiến tranh bao gồm chiến thắng cận chiến" sẽ có ý nghĩa hơn đối với tôi. Tôi muốn làm điều này và hợp nhất web- xmls và có các servlet và các bộ lọc từ bản đồ chiến tranh phụ và có sẵn trong kết quả Nếu có một xung đột tên servlet hoặc đường dẫn bản đồ servlet thì có một chính sách để giải quyết xung đột như đã đề cập ở trên. –

-1

Bạn có thể làm việc với One-Jar.

http://one-jar.sourceforge.net/

Nó có thể không làm mọi thứ bạn muốn.

+0

Một bình sẽ không hoạt động với các cuộc chiến tranh –

4

Tôi nhớ rằng cargo-maven2-plugin có một moóc uberwar. Tôi đã không sử dụng nó nhưng tôi hiểu nó được thiết kế để hợp nhất chiến tranh, mặc dù bạn cần phải cẩn thận để tránh xung đột.

Quét nhanh nguồn cho biết bạn xác định merge descriptor để xác định cách hợp nhất các cuộc chiến tranh. Thật không may là documentation site đã bị mất tích vì vậy tôi không thể cung cấp thêm chi tiết cho bạn.

Bạn có thể xem trang web Codehaus Jira để hiểu trạng thái hiện tại của nó.

Để sử dụng plugin bạn muốn xác định một cái gì đó cấu hình như thế này:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.codehaus.cargo</groupId> 
     <artifactId>cargo-maven2-plugin</artifactId> 
     <version>1.0</version> 
     <extensions>true</extensions> 
     <configuration> 
     <descriptor>merge.xml</descriptor> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 
<dependencies> 
    <dependency> 
    <groupId>project1.groupId</groupId> 
    <artifactId>project1</artifactId> 
    <type>war</type> 
    <version>1.0.0</version> 
    </dependency> 
    <dependency> 
    <groupId>project2.groupId</groupId> 
    <artifactId>project2</artifactId> 
    <type>war</type> 
    <version>1.2.0</version> 
    </dependency> 
</dependencies> 

(vẫn đang tìm kiếm một ví dụ merge.xml)

+0

@Pascal Tôi có xu hướng đồng ý, nhưng nếu không có tùy chọn để refactor, điều này cung cấp một workaround –

+0

@Rich Chắc chắn, đó là sự thật và tôi đã cho bạn +1 của tôi. Tôi đã xóa nhận xét trước đó của mình vì nhận xét đó có thể bị hiểu sai. –

+2

Xem http://cargo.codehaus.org/Merging+WAR+files –

1

EAR được thiết kế để chứa nhiều thứ. Đây có phải là một khả năng cho bạn?


Edit: Trước hết, cho phép giả định rằng không có nguồn lực trùng lặp (mà ta nên đi trong jar cuối cùng?) Và rằng tất cả các lọ tương thích (bạn chỉ có một phiên bản của mỗi thư viện, vv) .

Bạn sẽ có thể chỉ sao chép nội dung của WEB-INF/lên đầu trang của nhau, ngoại trừ các tệp XML khác nhau cần được hợp nhất một cách cẩn thận. Cách dễ nhất để làm điều này có lẽ là bằng cách sử dụng một biểu định kiểu XSLT cho phép bạn giữ hai tài liệu XML và hợp nhất chúng (nếu tôi nhớ chính xác đây là thẻ). bạn sẽ cần một tệp cho mỗi tệp xml để CERTAIN mà bạn làm điều này một cách chính xác - chỉ cần nghĩ về điều hướng JSF.

Vì vậy, suggetsion của tôi là một bản sao đơn giản của các tài nguyên và một tập tin cấu hình pr xml theo phong cách XSLT được tạo thủ công.

+0

Đây là một tùy chọn (sẽ giới hạn số lượng máy chủ web) nhưng trong trường hợp đó tôi vẫn cần chia sẻ bối cảnh phiên và bảo mật giữa các cuộc chiến tranh. Một số máy chủ ứng dụng cho phép chia sẻ phiên http giữa các cuộc chiến tranh, nhưng điều này dường như không phải là tính năng tiêu chuẩn. – Dan

+0

Tôi hiểu rằng EAR sẽ có thể giữ nhiều ứng dụng web không liên quan, nhưng sẽ không hợp nhất hai ứng dụng web thành một? Nhưng tôi nghĩ tôi cần nghiên cứu thêm về cách sử dụng EAR. Đề xuất bất kỳ dự án tham chiếu hoặc dự án EAR nào để xem? –

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