2012-02-11 37 views
15

Tôi đã sử dụng plugin maven-ear với plugin maven-war-plugin và maven-ejb-plugin để triển khai thành công và chạy một ứng dụng được đóng gói EAR đến Jboss AS7.Cách thiết lập đường dẫn lớp manifest đúng cách trong maven-war-plugin

. 
|-- META-INF 
| |-- application.xml 
| |-- MANIFEST.MF 
| `-- maven 
|  `-- com.patrac 
|   `-- Patrac-ear 
|    |-- pom.properties 
|    `-- pom.xml 
|-- Patrac-ejb-1.0-SNAPSHOT.jar 
`-- Patrac-web-1.0-SNAPSHOT.war 

Trong thư mục mã nguồn ứng dụng, poms nằm như sau:

. 
| 
|-- Patrac-ear 
| `-- pom.xml 
|-- Patrac-ejb 
| `-- pom.xml 
|-- Patrac-web 
| `-- pom.xml 
`-- pom.xml 

tôi không thể tìm ra cách để ngăn chặn một vài thông điệp cảnh báo khó chịu khi tôi triển khai ứng dụng:

!
12:32:03,958 WARN [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-components-ui-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war" does not point to a valid jar for a Class-Path reference. 
12:32:03,970 WARN [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-components-api-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war" does not point to a valid jar for a Class-Path reference. 
12:32:03,984 WARN [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-core-api-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war" does not point to a valid jar for a Class-Path reference. 
12:32:03,989 WARN [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-core-impl-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war" does not point to a valid jar for a Class-Path reference. 

Patrac-web-1,0-SNAPSHOT.war META-INF/MANIFEST.MF trông như thế này:

Manifest-Version: 1.0 
Built-By: pgarner 
Build-Jdk: 1.7.0_02 
Class-Path: Patrac-ejb-1.0-SNAPSHOT.jar richfaces-components-ui-4.0.0. 
Final.jar richfaces-components-api-4.0.0.Final.jar richfaces-core-api 
-4.0.0.Final.jar richfaces-core-impl-4.0.0.Final.jar cssparser-0.9.5. 
jar sac-1.3.jar guava-r08.jar 
Created-By: Apache Maven 
Archiver-Version: Plexus Archiver 

Mục nhập lớp ejb cần phải có mặt cho mô-đun EJB, cho tính di động và các mục nhập đường dẫn lớp richfaces, cssparser và ổi không được nằm trong tệp kê khai của WAR.

Vấn đề là WAR của tôi phụ thuộc vào tất cả các JAR, một số trong số đó sống trong WEB-INF/lib (RichFaces) và một JAR, Patrac-ejb-1.0-SNAPSHOT.jar, nằm trong thư mục gốc của EAR. Mỗi phụ thuộc cần phải được nhập vào Patrac-web/pom.xml nhưng KHÔNG phải mỗi phụ thuộc sẽ xuất hiện trong tệp kê khai.

Maven đặt các JAR vào đúng vị trí, nhưng nó đặt các mục nhập Class-Path cho TẤT CẢ các JAR vào tệp kê khai. Nó không nên làm điều này. CHỈ nên đặt một mục nhập cho Patrac-ejb-1.0-SNAPSHOT.jar.

<!-- 
    According to Java EE 6 spec, the application is portable if 
    Patrac-web.war's META-INF/MANIFEST.MF contains a Class-Path entry 
    for Patrac-ejb-1.0-SNAPSHOT.jar. 

    <optional>true</optional> is the flag that maven-war-plugin uses 
    to put the entry in MANIFEST.MF without copying Patrac-ejb-1.0-SNAPSHOT.jar 
    into WEB-INF/lib. This is what I want. 

    <scope>provided</scope> would cause maven-war-plugin to NEITHER 
    put the entry in MANIFEST.MF nor copy Patrac-ejb.jar into WEB-INF/lib, 
    which would not be good. 

    No tag at all would cause maven-war-plugin to BOTH put the entry in 
    MANIFEST.MF and copy Patrac-ejb.jar into WEB-INF/lib, which would 
    also not be good. 
    --> 
    <dependency> 
    <groupId>com.patrac</groupId> 
    <artifactId>Patrac-ejb</artifactId> 
    <type>ejb</type> 
    <optional>true</optional> 
    </dependency> 

    <!-- 
    These two dependencies are used to copy 
    the other JAR files into WEB-INF/lib and there 
    should not be any class-path entries for such 
    JARs in MANIFEST.MF, in order to avoid the 
    error messages. 
    --> 
    <dependency> 
     <groupId>org.richfaces.ui</groupId> 
     <artifactId>richfaces-components-ui</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.richfaces.core</groupId> 
     <artifactId>richfaces-core-impl</artifactId> 
    </dependency> 

Tôi đang sử dụng phiên bản plugin maven-war-plugin gần đây nhất, 2.2. Làm thế nào để tôi nói maven-war-plugin để đặt các JAR "non-ejb" vào WEB-INF/lib trong khi không đặt các mục nhập class-path trong MANIFEST.MF?

Bất kỳ lời khuyên hoặc con trỏ nào bạn có được đánh giá cao.

Tài liệu tham khảo:

Trả lời

19

Maven archiver, được sử dụng bởi Maven WAR plugin, cung cấp phương tiện để tạo các mục nhập Class-Path trong tệp kê khai của WAR nhưng tiếc là trình lưu trữ có cách tiếp cận tất cả hoặc không có gì. Khi bạn vượt qua addClassPath=true vào cấu hình lưu trữ, trình lưu trữ sẽ đặt các mục nhập Class-Path cho tất cả phụ thuộc bắt buộc và tùy chọn của WAR vào tệp kê khai.

Tuy nhiên, một số mục đơn giản không thuộc về đó. Mục nhập đường dẫn lớp được sử dụng để biểu thị "Download Extensions," hoặc tham chiếu đến JARs bên ngoài tới WAR.Các JAR nằm trong số WEB-INF/lib nên không, do đó, có các mục nhập Đường dẫn lớp trong tệp kê khai của WAR. Plugin Maven's War sẽ phá vỡ quy tắc này khi bạn đặt addClassPath=true trong bộ lưu trữ. Ngoài ra, khi bạn vượt qua addClassPath=true đến kho lưu trữ của Maven, nó cung cấp cho tất cả các mục nhập Class-Path cùng một tiền tố thư mục - bất kể vị trí phụ thuộc nằm trong EAR. Điều này gây ra vấn đề khi tùy chọn và yêu cầu phụ thuộc được đặt tại các vị trí riêng biệt như thư mục gốc EAR, EAR lib và WAR WEB-INF/lib. Đương nhiên, khi một triển khai một EAR có tệp kê khai WAR chứa các lỗi trên, JBoss sẽ ném cảnh báo nếu trình nạp lớp WAR cuối cùng có thể tìm thấy một phụ thuộc (JAR nằm trong WEB-INF/lib) hoặc lỗi nếu tiền tố đường dẫn sai (ví dụ: EJB JAR hoặc phụ thuộc trong thư mục EAR lib). Do đó, nếu WAR của bạn, giống như tôi, phụ thuộc vào mô-đun EJB, nằm ở gốc của EAR, và bất kỳ số lượng phụ thuộc nào được đặt trong WEB-INF/lib, trình lưu trữ Maven sẽ tạo ra các mục Class-Path cho tất cả các phụ thuộc và tất cả chúng sẽ có cùng tiền tố bất kể vị trí của chúng trong EAR.

Không tốt.

Vấn đề sẽ được cải thiện đôi chút nếu người lưu trữ cung cấp phương tiện để loại trừ các mục nhập Class-Path của các JAR nằm trong WEB-INF. Nhưng nó không.

Dưới đây là một bản tóm tắt về kết quả cho mỗi thiết lập phụ thuộc khi có ai sử dụng addClassPath=true:

  Setting     Generate    Copy JAR into 
            Class-Path    WEB-INF/lib 
            Entry 

1. <scope>provided</scope>    NO      NO 

2. <optional>true</optional>   YES      NO 

3. (no option -- default)    YES      YES 

4. ?????        NO      YES 

Điều cần thiết là bảo hiểm cho tình hình # 4, ở trên: không tạo ra một mục Class-Path và, vâng, sao chép JAR vào WEB-INF/lib. Trình lưu trữ Maven sẽ thực hiện hành vi này theo mặc định.

Giải pháp tốt nhất mà tôi có thể nghĩ là sử dụng lực lượng vũ phu và tắt tính năng tạo đường dẫn lớp đường dẫn tự động của trình lưu trữ Maven. Thay vào đó, tôi tạo ra một cách rõ ràng mục nhập Class-Path cho mô-đun EJB trong tệp kê khai của WAR bằng cách sử dụng tùy chọn manifestEntries của trình lưu trữ. Các cách để làm điều này là để loại bỏ những điều sau đây từ Patrac-web/pom.xml:

<manifest> 
    <addClasspath>true</addClasspath> 
</manifest> 

và thay thế nó với điều này:

<manifestEntries> 
    <Class-Path>Patrac-ejb-${project.version}.jar</Class-Path> 
</manifestEntries> 

Sử dụng cấu hình này chỉ có một lối vào Class-Path, cho module EJB, được tạo ra một cách rõ ràng.

1

Đối với những lọ với cần phải được loại trừ khỏi MANIFEST và từ WEB-INF/lib bạn cần đánh dấu chúng là <scope>provided</scope>. Điều đó có nghĩa là các tệp JAR sẽ được cung cấp bởi vùng chứa (và đó là EAR trong trường hợp của bạn).

Để biết các tùy chọn khác, hãy kiểm tra WAR manifest guide.

+1

các [War manifest dẫn] (http: // Mave n.apache.org/plugins/maven-war-plugin/examples/war-manifest-guide.html) hiển thị 3 ví dụ và cung cấp ghi chú: "Không có cách nào được hiển thị cách bao gồm một phụ thuộc trong WEB-INF/lib nhưng không có trong đường dẫn lớp kê khai." Hướng dẫn sau đó nói, "Kiểm tra [Hướng dẫn làm việc với các tệp kê khai] (http://maven.apache.org/guides/mini/guide-manifest.html) để biết thêm ví dụ." Trang thứ hai này chỉ đơn giản giới thiệu tôi trở lại trang hướng dẫn tệp kê khai WAR. Tôi cần để có thể làm theo các ví dụ đó không được hiển thị. –

+0

Bạn muốn bao gồm một phụ thuộc trong WEB-INF/lib nhưng không bao gồm trong classpath manifest? Tại sao bạn cần điều đó? Nếu 'richfaces',' cssparser' và 'guava' của bạn để lại trong EAR, thì những phụ thuộc này sẽ được đánh dấu là' được cung cấp'. –

+0

Richfaces và cộng sự là các phụ thuộc bắt buộc của mô-đun WAR. Vì vậy, chúng phải ở trong WEB-INF/lib. Sự hiểu biết của tôi là không có mục Class-Path nào cần được thực hiện cho các JAR trong WEB-INF vì các tệp đó sẽ được tải tự động bởi trình nạp lớp của WAR. Chỉ có các mục nhập Class-Path cho các JAR _external_ cho mô-đun WAR cần được nhập vào tệp kê khai của WAR. Trong trường hợp của tôi, một mục nhập phải được thực hiện cho JJ EJB. Đây là thông số kỹ thuật của JEE. RichFaces và cộng sự là các phụ thuộc bắt buộc của mô đun WAR và do đó không được đánh dấu là 'được cung cấp'. –

0

Các ejb entry đẳng cấp con đường cần phải có mặt cho các mô-đun EJB ...

Lớp-con đường duy nhất cần phải có mặt cho module EJB (trong thư mục gốc của EAR), người tham khảo khác module EJB (trong thư mục gốc của EAR cùng)

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