2012-03-29 12 views
8

Sto usando jBoss AS 7 per pubblicare i miei vari progetti, e tutti usano l'API di Jersey, quindi invece di distribuirlo in ogni progetto ho voluto creare un modulo per esso. Per questo, ho creato la cartella JBOSS_HOME \ moduli \ com \ sole \ Jersey \ principale e in questa cartella ho messo del vaso Jersey e il file Module.xml:Creazione del modulo in 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> 

per impedire l'uso di JBoss JAX- RS ho rimosso dal file JBOSS_HOME \ standalone \ standalone.xml le seguenti righe:

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

In MyProjectEAR cartella \ META-INF ho creato il file jboss-distribuzione-structure.xml con la seguente struttura:

<?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> 

mio MyProject file \ webcontent \ web.xml è questo:

<?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> 

Il mio file presenti manifesto a MyProject \ WebContent \ META-INF \ MANIFEST.MF è questo:

Manifest-Version: 1.0 
Class-Path: 

quando ho cercato di distribuire il progetto ho ottenuto il seguente errore:

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: * Se ho posto l'API Jersey nel JBOSS_HOME \ moduli \ com \ sole \ jsf-impl \ principale e c appendi il modulo module.xml corrispondente funziona tutto ok. Che cosa ha questa posizione diversa?

risposta

7

avevo bisogno di aggiungere

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

nella JBOSS_HOME \ standalone \ configurazione \ standalone.xml file di configurazione

0

Non sono un esperto di jboss-moduli, ma ci sono un paio di cose che potresti provare.

Hai detto di aver inserito tutti i file JAR e module.xml in JBOSS_HOME\modules\com\sun\Jersey\main. Osserva la capitale J. Non so che sia importante, ma tu per coerenza, almeno potresti voler fare una minuscola.

Inoltre, non penso che vogliate il <include path="**"/> nel jboss-deployment-structure.xml.

Ancora una volta, potrei sbagliarmi dato che non sono sicuramente un esperto di moduli jboss, ma proverei prima queste due cose.

+0

La capitale J era solo un errore quando ho digitato il percorso qui;) provato a rimuovere t he ma non funziona ancora :( –

+0

Forse prova a inserire un pessimo codice XML in jboss-deployment-structure.xml per vedere se è ancora in fase di elaborazione. forse parte del problema c'è. Ancora una volta, è solo un'ipotesi. –

0

Commenta il param di init in web.xml che veramente preoccupa 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

I moduli globali possono anche essere aggiunti tramite l'interfaccia CLI.

Ciò rende più semplice per apportare modifiche, come si può creare un file batch ed eseguirlo ./jboss-cli.sh --file {percorso di file}

2

Se si utilizza Maven, è possibile aggiungere un riferimento a un modulo in JBoss AS in questo modo:

<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> 

che genererà automaticamente le voci manifesto per voi.

ho personalmente di utilizzare questo approccio per evitare il "Native Biblioteca XXXXXXX già caricato in un altro classloader" errore durante il caricamento com.microsoft.jdbc.sqlserver.SQLServerDriver che ho definito come modulo in JBoss AS - Che le connessioni definite da JNDI possono connettersi a MSSQL e allo stesso tempo posso riutilizzare tale dipendenza per connettersi direttamente al DB (questa volta tramite DriverManager invece di JNDI).

3

C'è già una risposta, ma vorrei chiarire un po 'l'argomento per i futuri lettori.

Ci sono tre posti dove poter dichiarare un modulo JBoss come dipendenza di altre implementazioni in JBoss 7 (EAP 6):

  1. moduli globali
  2. MANIFEST.MF
  3. jboss-distribuzione -structure.xml

Nella maggior parte dei casi, sono alternativa.

1. Moduli globali

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.

è possibile aggiungere facilmente moduli globali dalla console di gestione (vedi fonti), o modificando lo 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

Aggiungere un Dependencies ingresso al MANIFEST File .MF con un elenco separato da virgola dei nomi dei moduli di dipendenza.

Dependencies: org.javassist, org.apache.velocity 

Se si utilizza Maven, è sufficiente configurare alcuni plug-in. ad es. Per orecchio.

<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> 

NOTA: utilizzando export rende il com.foo.bar.test-module visibile per tutti i moduli in bundle nell'orecchio.

3. jboss-distribuzione-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)

Si può vedere dalla documentazione di seguito quanto potente è paragonato a MANIFEST.MF. Per il caso più semplice, ecco un esempio:

<?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> 

NOTA 1: proprio come con MANIFEST.MF, impostando export=true rende il com.foo.bar.test-module visibile per tutti i moduli in bundle nell'orecchio.

NOTA 2: l'attributo optional=true/false è anche disponibile in jboss-deployment-structure.xml, ma non funziona correttamente per versioni specifiche (probabilmente < EAP 6.4.7). Controllalo, se ne hai bisogno.

Spero che aiuti.

Fonti:

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

Problemi correlati