2012-03-29 27 views
8

Tôi đang sử dụng jBoss AS 7 để xuất bản các dự án khác nhau của mình và tất cả đều sử dụng API Jersey, vì vậy thay vì triển khai nó trong mọi dự án tôi muốn tạo mô-đun cho nó. Cho rằng, tôi đã tạo thư mục JBOSS_HOME \ modules \ com \ sun \ Jersey \ chính và trong thư mục này, tôi đặt Jersey jar và file module.xml:Tạo mô-đun trong jBoss AS

<?xml version="1.0" encoding="UTF-8"?> 
<module xmlns="urn:jboss:module:1.1" name="com.sun.jersey"> 
    <properties> 
     <property name="jboss.api" value="private"/> 
    </properties> 
    <resources> 
     <resource-root path="jersey-bundle-1.12.jar"/> 
     <resource-root path="asm-3.1.jar"/> 
     <resource-root path="jackson-core-asl-1.9.2.jar"/> 
     <resource-root path="jackson-jaxrs-1.9.2.jar"/> 
     <resource-root path="jackson-mapper-asl-1.9.2.jar"/> 
     <resource-root path="jackson-xc-1.9.2.jar"/>   
     <resource-root path="jersey-client-1.12.jar"/> 
     <resource-root path="jersey-core-1.12.jar"/> 
     <resource-root path="jersey-json-1.12.jar"/> 
     <resource-root path="jersey-server-1.12.jar"/> 
     <resource-root path="jersey-servlet-1.12.jar"/> 
     <resource-root path="jettison-1.1.jar"/> 
     <resource-root path="jsr311-api-1.1.1.jar"/> 
    </resources> 
    <dependencies> 
     <module name="javax.api"/> 
     <module name="org.jboss.staxmapper"/> 
     <module name="org.jboss.as.controller"/> 
     <module name="org.jboss.as.server"/> 
     <module name="org.jboss.modules"/> 
     <module name="org.jboss.msc"/> 
     <module name="org.jboss.logging"/> 
     <module name="org.jboss.vfs"/> 
    </dependencies> 
</module> 

Để ngăn chặn việc sử dụng các JBoss JAX- RS tôi lấy ra từ tập tin JBOSS_HOME \ độc \ standalone.xml những dòng sau:

<subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/> 
<extension module="org.jboss.as.jaxrs"/> 

Trong MyProjectEAR \ thư mục META-INF tôi tạo ra các tập tin jboss-triển khai-structure.xml với cấu trúc sau:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> 
    <deployment> 
     <dependencies> 
     <module name="com.sun.jersey" slot="main" > 
      <imports> 
       <include path="META-INF/**"/> 
       <include path="**"/> 
      </imports> 
     </module> 
     </dependencies> 
    </deployment> 
</jboss-deployment-structure> 

My MyProject \ Webcontent \ file web.xml là thế này:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <display-name> MyProject </display-name> 

    <servlet> 
     <description> 
     </description> 
     <servlet-name>Jersey Servlet</servlet-name> 
     <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <description></description> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>com.MyProject.service.REST_Application</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Jersey Servlet</servlet-name> 
     <url-pattern>/jaxrs/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

tập tin hiện tại biểu hiện của tôi tại MyProject \ Webcontent \ META-INF \ MANIFEST.MF là thế này:

Manifest-Version: 1.0 
Class-Path: 

Khi tôi đã cố gắng để triển khai các dự án tôi đã nhận lỗi sau:

12:12:11,804 INFO [org.jboss.as.server.deployment] (MSC service thread 1-5) JBAS015876: Starting deployment of "MyProjectEAR.ear" 
12:12:11,852 INFO [org.jboss.as.server.deployment] (MSC service thread 1-7) JBAS015876: Starting deployment of "MyProject.war" 
12:12:12,052 WARN [org.jboss.as.dependency.private] (MSC service thread 1-3) JBAS018567: Deployment "deployment.MyProjectEAR.ear" is using a private module ("com.sun.jersey:main") which may be changed or removed in future versions without notice. 
12:12:12,054 WARN [org.jboss.as.dependency.private] (MSC service thread 1-3) JBAS018567: Deployment "deployment.MyProjectEAR.ear" is using a private module ("com.sun.jersey:main") which may be changed or removed in future versions without notice. 
12:12:12,055 WARN [org.jboss.as.dependency.private] (MSC service thread 1-3) JBAS018567: Deployment "deployment.MyProjectEAR.ear" is using a private module ("com.sun.misc:main") which may be changed or removed in future versions without notice. 
12:12:12,057 WARN [org.jboss.as.dependency.private] (MSC service thread 1-3) JBAS018567: Deployment "deployment.MyProjectEAR.ear" is using a private module ("com.sun.misc:main") which may be changed or removed in future versions without notice. 
12:12:12,117 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7) MSC00001: Failed to start service jboss.deployment.subunit."MyProjectEAR.ear"."MyProject.war".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."MyProjectEAR.ear"."MyProject.war".POST_MODULE: Failed to process phase POST_MODULE of subdeployment "MyProject.war" of deployment "MyProjectEAR.ear" 
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:119) [jboss-as-server-7.1.0.Final.jar:7.1.0.Final] 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA] 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) [rt.jar:1.6.0_30] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [rt.jar:1.6.0_30] 
    at java.lang.Thread.run(Unknown Source) [rt.jar:1.6.0_30] 
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011093: Could not load component class com.sun.jersey.spi.container.servlet.ServletContainer 
    at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.processComponentConfig(InterceptorAnnotationProcessor.java:113) 
    at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.deploy(InterceptorAnnotationProcessor.java:54) 
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.0.Final.jar:7.1.0.Final] 
    ... 5 more 
Caused by: java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer from [Module "deployment.MyProjectEAR.ear.MyProject.war:main" from Service Module Loader] 
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190) [jboss-modules.jar:1.1.1.GA] 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468) [jboss-modules.jar:1.1.1.GA] 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456) [jboss-modules.jar:1.1.1.GA] 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398) [jboss-modules.jar:1.1.1.GA] 
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120) [jboss-modules.jar:1.1.1.GA] 
    at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.processComponentConfig(InterceptorAnnotationProcessor.java:111) 
    ... 7 more 
12:12:12,340 INFO [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS015870: Deploy of deployment "MyProjectEAR.ear" was rolled back with failure message {"JBAS014671: Failed services" => {"jboss.deployment.subunit.\"MyProjectEAR.ear\".\"MyProject.war\".POST_MODULE" => "org.jboss.msc.service.StartException in service jboss.deployment.subunit.\"MyProjectEAR.ear\".\"MyProject.war\".POST_MODULE: Failed to process phase POST_MODULE of subdeployment \"MyProject.war\" of deployment \"MyProjectEAR.ear\""}} 
12:12:12,351 INFO [org.jboss.as.server.deployment] (MSC service thread 1-5) JBAS015877: Stopped deployment MyProject.war in 9ms 
12:12:12,353 INFO [org.jboss.as.server.deployment] (MSC service thread 1-5) JBAS015877: Stopped deployment MyProjectEAR.ear in 12ms 
12:12:12,355 INFO [org.jboss.as.controller] (DeploymentScanner-threads - 2) JBAS014774: Service status report 
JBAS014777: Services which failed to start:  service jboss.deployment.subunit."MyProjectEAR.ear"."MyProject.war".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."MyProjectEAR.ear"."MyProject.war".POST_MODULE: Failed to process phase POST_MODULE of subdeployment "MyProject.war" of deployment "MyProjectEAR.ear" 
12:12:12,359 ERROR [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) {"JBAS014653: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"JBAS014671: Failed services" => {"jboss.deployment.subunit.\"MyProjectEAR.ear\".\"MyProject.war\".POST_MODULE" => "org.jboss.msc.service.StartException in service jboss.deployment.subunit.\"MyProjectEAR.ear\".\"MyProject.war\".POST_MODULE: Failed to process phase POST_MODULE of subdeployment \"MyProject.war\" of deployment \"MyProjectEAR.ear\""}}}} 

* EDIT: * Nếu tôi đặt API Jersey trong JBOSS_HOME \ modules \ com \ sun \ jsf-impl \ chính và c hange các module.xml tương ứng tất cả mọi thứ hoạt động ok. Vị trí này có gì khác nhau?

Trả lời

7

tôi cần phải thêm

<subsystem xmlns="urn:jboss:domain:ee:1.0"> 
    <global-modules> 
     <module name="com.sun.jersey" slot="main"/> 
    </global-modules> 
</subsystem> 

vào JBOSS_HOME \ độc \ cấu hình \ standalone.xml cấu hình tập tin

0

Tôi không phải là chuyên gia mô-đun jboss, nhưng có một vài điều bạn có thể thử.

Bạn đã nói bạn đặt tất cả tệp JAR và module.xml vào JBOSS_HOME\modules\com\sun\Jersey\main. Lưu ý về vốn J. Tôi không biết rằng nó quan trọng, nhưng bạn cho sự nhất quán ít nhất bạn có thể muốn làm cho nó thấp hơn trường hợp.

Ngoài ra, tôi không nghĩ bạn muốn số <include path="**"/> trong số jboss-deployment-structure.xml.

Một lần nữa, tôi có thể sai vì tôi chắc chắn không phải là chuyên gia về mô-đun jboss, nhưng tôi sẽ thử hai thứ đó trước tiên.

+0

Vốn J chỉ là một lỗi khi tôi gõ những con đường ở đây;) Cố gắng loại bỏ t anh ta nhưng nó vẫn không hoạt động: ( –

+0

Có thể thử đặt một số XML xấu vào tệp cấu trúc jboss-deployment -.xml để xem liệu nó có đang được xử lý hay không. có lẽ một phần của vấn đề là có. Một lần nữa, đó chỉ là một đoán mặc dù. –

0

Nhận xét tham số init trong tệp web.xml thực sự wor ked ...

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <display-name> MyProject </display-name> 

    <servlet> 
     <description> 
     </description> 
     <servlet-name>Jersey Servlet</servlet-name> 
     <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
     <!-- <init-param> 
      <description></description> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>com.MyProject.service.REST_Application</param-value> 
     </init-param>--> 

     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Jersey Servlet</servlet-name> 
     <url-pattern>/jaxrs/*</url-pattern> 
    </servlet-mapping> 
</web-app> 
0

Mô-đun chung cũng có thể được thêm vào thông qua giao diện CLI.

Điều này làm cho nó dễ dàng để thực hiện thay đổi như bạn có thể tạo một tập tin thực thi và chạy nó ./jboss-cli.sh --file {đường dẫn đến tập tin}

2

Nếu sử dụng Maven, bạn có thể thêm một tham chiếu đến một mô-đun trong JBoss AS như thế này:

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.2</version> 
    <configuration> 
     <archive> 
      <manifestEntries> 
       <!-- List your dependencies here --> 
       <Dependencies>com.sun.jersey</Dependencies> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 

Điều này sẽ tự động tạo mục kê khai cho bạn.

Cá nhân tôi phải sử dụng phương pháp này để tránh lỗi "Thư viện gốc xxxxxxx đã tải trong trình nạp lớp khác" trong khi tải com.microsoft.jdbc.sqlserver.SQLServerDriver mà tôi đã xác định là mô-đun trong JBoss AS - Điều đó cách JNDI xác định các kết nối có thể kết nối với MSSQL, và đồng thời tôi có thể tái sử dụng phụ thuộc đó để kết nối trực tiếp với DB (thời gian này DriverManager máng thay vì JNDI).

3

Đã có câu trả lời nhưng tôi muốn làm rõ chủ đề một chút cho độc giả trong tương lai.

ba nơi nơi để tuyên bố một module JBoss như một sự phụ thuộc của các triển khai khác trong JBoss 7 (EAP 6):

  1. module toàn cầu
  2. MANIFEST.MF
  3. JBoss triển khai -structure.xml

Trong hầu hết các trường hợp, chúng là thay thế.

1. module toàn cầu

A global module is a module that JBoss Enterprise Application Platform 6 provides as a dependency to every application. Any module can be made global by adding it to the application server's list of global modules.

Bạn có thể dễ dàng thêm các module toàn cầu từ công tác quản lý giao diện điều khiển (xem nguồn), hoặc bằng cách chỉnh sửa standalone.xml:

<subsystem xmlns="urn:jboss:domain:ee:1.0" >    
    <global-modules> 
    <!-- Add global modules here --> 
    <module name="org.javassist" slot="main" />    
    </global-modules> 
</subsystem> 

2. MANIFEST.MF

Thêm Dependencies mục nhập vào MANIFEST Tệp .MF với danh sách các tên mô-đun phụ thuộc được phân tách bằng dấu phẩy.

Dependencies: org.javassist, org.apache.velocity 

Nếu bạn đang sử dụng Maven, bạn chỉ cần định cấu hình một số plugin. ví dụ: đối với tai.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-ear-plugin</artifactId> 
    <configuration> 
     <version>6</version> 
     ... 
     <defaultLibBundleDir>lib</defaultLibBundleDir> 
     <archive> 
      <manifestEntries> 
       <Dependencies> 
        com.foo.bar.test-module export optional 
        <!-- Beware of new lines! They can quietly break the conf --> 
       </Dependencies> 
      </manifestEntries> 
     </archive> 
     <modules> 
      ... 
     </modules> 
    </configuration> 
</plugin> 

Chú ý: sử dụng export làm cho com.foo.bar.test-module rõ ràng cho tất cả các module đi kèm trong tai.

3. JBoss-triển khai-structure.xml

jboss-deployment-structure.xml is a JBoss specific deployment descriptor that can be used to control class loading in a fine grained manner. It should be placed in the top level deployment, in META-INF (or WEB-INF for web deployments)

Bạn có thể nhìn thấy từ tài liệu dưới uy lực của nó được so sánh với MANIFEST.MF. Đối với trường hợp đơn giản nhất, đây là một ví dụ:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure> 
    <ear-subdeployments-isolated>false</ear-subdeployments-isolated> 
    <deployment> 
     <dependencies> 
      <!-- Add modules here --> 
      <module name="com.foo.bar.test-module" export="true"/> 
      <module name="org.apache.axis.axis-jaxrpc" export="true"/> 
     </dependencies> 
    </deployment> 
</jboss-deployment-structure> 

LƯU Ý 1: giống như với MANIFEST.MF, thiết export=true làm cho com.foo.bar.test-module rõ ràng cho tất cả các module đi kèm trong tai.

CHÚ Ý 2: Thuộc tính optional=true/false cũng có sẵn trong tệp jboss-deployment-structure.xml, nhưng không hoạt động đúng cho các phiên bản cụ thể (có thể là < EAP 6.4.7). Kiểm tra xem nó ra, nếu bạn cần nó.

Hy vọng điều đó sẽ hữu ích.

Nguồn:

RedHat docs - Add an Explicit Module Dependency to a Deployment

RedHat docs - Configuring Modules

RedHat docs - Add a module to all deployments

JBoss AS 7 Developer Guide

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