Создание модуля в jBoss AS - PullRequest
9 голосов
/ 29 марта 2012

Я использую jBoss AS 7 для публикации своих различных проектов, и все они используют Jersey API, поэтому вместо развертывания его в каждом проекте я хотел создать для него модуль.Для этого я создал папку JBOSS_HOME \ modules \ com \ sun \ Jersey \ main и в эту папку поместил банку Джерси и файл module.xml:

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

Для предотвращения использования jBossJAX-RS Я удалил из файла JBOSS_HOME \ standalone \ standalone.xml следующие строки:

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

В папке MyProjectEAR \ META-INF я создал файл jboss-deploy-structure.xml со следующей структурой:

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

Мой файл MyProject \ webContent \ web.xml - это:

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

Мой файл манифеста, присутствующий в MyProject \ webContent \ META-INF \ MANIFEST.MF, выглядит так:

Manifest-Version: 1.0
Class-Path:

Когда я пытался развернуть проект, я получил следующую ошибку:

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\""}}}}

* РЕДАКТИРОВАТЬ: * Если я размещу API Джерси в JBOSS_HOME \modules \ com \ sun \ jsf-impl \ main и измените соответствующий module.xml все работает нормально.Чем отличается это место?

Ответы [ 7 ]

13 голосов
/ 30 марта 2012

Вам необходимо указать зависимость от вашего модуля в развертывании.

META-INF \ MANIFEST.MF

Dependencies: com.sun.jersey

См. Также https://docs.jboss.org/author/display/AS71/Class+Loading+in+AS7

8 голосов
/ 21 ноября 2012

Мне нужно было добавить

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

в файл конфигурации JBOSS_HOME \ standalone \ configuration \ standalone.xml

5 голосов
/ 17 августа 2016

Ответ уже есть, но я бы хотел немного уточнить тему для будущих читателей.

Есть три места , где можно объявить модуль JBoss в качестве зависимостидругих развертываний в JBoss 7 (EAP 6):

  1. Глобальные модули
  2. MANIFEST.MF
  3. jboss-deploy-structure.xml

В большинстве случаев это альтернатива .

1.Глобальные модули

Глобальный модуль - это модуль, который JBoss Enterprise Application Platform 6 предоставляет в качестве зависимости для каждого приложения.Любой модуль можно сделать глобальным, добавив его в список глобальных модулей сервера приложений.

Вы можете легко добавить глобальные модули из консоли управления (см. Источники) или путем редактирования 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

Добавьте запись Dependencies в файл MANIFEST.MF со списком разделенных запятыми имен модулей зависимостей.

Dependencies: org.javassist, org.apache.velocity

Если вы используете Maven,вам просто нужно настроить некоторые плагины.например, для уха.

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

ПРИМЕЧАНИЕ: использование export делает com.foo.bar.test-module видимым для всех модулей, входящих в комплект уха.

3.jboss-deploy-structure.xml

jboss-deploy-structure.xml - это специфический JBoss-дескриптор развертывания, который можно использовать для точного управления загрузкой классов.Он должен быть размещен в развертывании верхнего уровня, в META-INF (или WEB-INF для веб-развертываний)

Из документов ниже видно, насколько он мощен по сравнению с MANIFEST.MF.Для простейшего случая вот пример:

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

ПРИМЕЧАНИЕ 1. Как и в случае с MANIFEST.MF, установка export=true делает com.foo.bar.test-module видимым для всех модулей, входящих в комплект.

ПРИМЕЧАНИЕ 2. Атрибут optional=true/false также доступен в jboss-deploy-structure.xml, но не работает должным образом для определенных версий (возможно,

Надеюсь, это поможет.

Источники :

Документы RedHat - добавление явной зависимости от модуляв развертывание

Документы RedHat - Настройка модулей

Документы RedHat - Добавление модуля во все развертывания

Руководство разработчика JBoss AS 7

2 голосов
/ 28 июня 2013

Если вы используете Maven, вы можете добавить ссылку на модуль в JBoss AS следующим образом:

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

Который автоматически создаст записи манифеста для вас.

Я лично должен использовать этот подход, чтобы избежать ошибки «Native Library xxxxxxx, уже загруженной в другой загрузчик классов» при загрузке com.microsoft.jdbc.sqlserver.SQLServerDriver , которую я определил как модуль в JBoss AS - Таким образом, определенные JNDI соединения могут подключаться к MSSQL, и в то же время я могу повторно использовать эту зависимость для непосредственного подключения к БД (на этот раз через DriverManager вместо JNDI).

0 голосов
/ 15 мая 2013

Глобальные модули также могут быть добавлены через интерфейс CLI.

Это позволяет легко вносить изменения, поскольку вы можете создать пакетный файл и запустить его ./jboss-cli.sh --file {путь к файлу}

0 голосов
/ 17 апреля 2013

Закомментируйте параметр init в web.xml, который действительно работал ...

<?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 голосов
/ 29 марта 2012

Я не эксперт по jboss-modules, но есть пара вещей, которые вы можете попробовать.

Вы сказали, что поместили все файлы JAR и module.xml в JBOSS_HOME\modules\com\sun\Jersey\main.Обратите внимание на заглавную букву J. Я не знаю, что это имеет значение, но вы для последовательности, по крайней мере, могли бы хотеть сделать это строчными буквами.1007 *.

Опять же, я могу ошибаться, поскольку я определенно не эксперт по jboss-modules, но сначала попробую эти две вещи.

...