2012-03-29 9 views
8

Używam JBoss AS 7 opublikować moje różne projekty, a wszystkie z nich korzysta z API Jersey, więc zamiast wdrażania go w każdym projekcie Chciałem stworzyć moduł dla niego. Za to, że stworzył folder JBOSS_HOME \ modules \ com \ sun \ Jersey \ main iw tym folderze umieściłem na Jersey słoik i module.xml file:Tworzenie modułu w 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> 

Aby uniemożliwić korzystanie z JBoss JAX- RS I usunąć z pliku JBOSS_HOME \ samodzielny \ standalone.xml następujące linie:

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

W MyProjectEAR katalogu \ meta-INF utworzonego plik JBoss rozmieszczeniem-structure.xml o następującej strukturze:

<?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 \ plik web.xml jest taka:

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

Mój plik manifestu obecny w myproject \ WebContent \ META-INF \ MANIFEST.MF to:

Manifest-Version: 1.0 
Class-Path: 

Kiedy próbowałem wdrożyć projekt mam następujący błąd:

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: * Gdybym umieścić API Jersey w JBOSS_HOME \ modułów \ com \ Sun \ JSF-impl \ main ic hange odpowiedni moduł.xml wszystko działa poprawnie. Co ta lokalizacja ma inne?

Odpowiedz

7

Musiałem dodać

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

do JBOSS_HOME \ standalone \ Configuration \ standalone.xml konfiguracji pliku

0

Nie jestem ekspertem od jboss-modules, ale istnieje kilka rzeczy, które możesz wypróbować.

Powiedziałeś, że umieściłeś wszystkie pliki JAR i module.xml w JBOSS_HOME\modules\com\sun\Jersey\main. Zauważcie, że to stolica J. Nie wiem, czy to ma znaczenie, ale ty dla spójności przynajmniej możesz chcieć zrobić to małymi literami.

Również nie sądzę, że chcesz <include path="**"/> w jboss-deployment-structure.xml.

Ponownie, mogę się mylić, ponieważ na pewno nie jestem ekspertem JBoss moduły, ale chciałbym spróbować te dwie rzeczy w pierwszej kolejności.

+0

Kapitał J był tylko błąd, gdy wpisałem ścieżkę tutaj;) Próbowałem usunięcie t on , ale nadal nie działa :( –

+0

Może spróbuj umieścić złe XML w jboss-deployment-structure.xml, aby sprawdzić, czy jest on przetwarzany. może część problemu istnieje. Znowu, to tylko zgadnij. –

0

Skomentuj parametr init w web.xml, który naprawdę jest 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

Moduły globalne można również dodawać za pośrednictwem interfejsu CLI.

To sprawia, że ​​łatwo wprowadzać zmiany, jak można utworzyć plik wsadowy i uruchomić go ./jboss-cli.sh --file {ścieżkę do pliku}

2

przypadku korzystania Maven, można dodać odniesienie do moduł w JBoss AS podobny do tego:

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

Który automatycznie wygeneruje dla Ciebie wpisy do manifestu.

osobiście musiał użyć tej metody, aby uniknąć „Native Library xxxxxxx już załadowany w innym classloader” błąd podczas ładowania com.microsoft.jdbc.sqlserver.SQLServerDriver że zostały zdefiniowane jako moduł w JBoss AS - To sposób połączenia zdefiniowane przez JNDI mogą łączyć się z MSSQL, a jednocześnie mogę ponownie wykorzystać tę zależność do bezpośredniego połączenia się z bazą danych (tym razem przez DriverManager zamiast JNDI).

3

Istnieje już odpowiedź, ale chciałbym wyjaśnić nieco temat przyszłym czytelnikom.

Istnieje trzech miejsc w razie zadeklarować moduł JBoss jako zależność innych wdrożeniach w JBoss 7 EAP (6)

  1. moduły globalne
  2. MANIFEST.MF
  3. JBoss rozmieszczeniem -structure.xml

W większości przypadków są one alternatywa.

1. Moduły globalne

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.

można łatwo dodać globalne moduły z konsoli zarządzania (patrz źródła) lub poprzez edycję 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

Dodaj wpis Dependencies do MANIFESTU .MF plik z rozdzieloną przecinkami listą nazw modułów zależności.

Dependencies: org.javassist, org.apache.velocity 

Jeśli używasz Mavena, wystarczy skonfigurować niektóre wtyczki. np. Do ucha.

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

UWAGA: używanie export czyni com.foo.bar.test-module widoczna dla wszystkich modułów dołączonych do ucha.

3. JBoss-rozmieszczenie-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)

Widać z docs poniżej, jak potężny jest to w porównaniu do MANIFEST.MF. Na najprostszym przypadku, oto przykład:

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

UWAGA 1: podobnie jak w przypadku MANIFEST.MF ustawienie export=true czyni com.foo.bar.test-module widoczna dla wszystkich modułów dołączonych do ucha. UWAGA: atrybut optional=true/false jest również dostępny w jboss-deployment-structure.xml, ale nie działa poprawnie w określonych wersjach (prawdopodobnie < EAP 6.4.7). Sprawdź to, jeśli tego potrzebujesz.

Mam nadzieję, że to pomaga.

Źródła:

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