在jBoss AS中创建模块

Gon*_*oso 9 java deployment configuration jersey jboss7.x

我正在使用jBoss AS 7发布我的各种项目,并且所有项目都使用Jersey API,因此我不想在每个项目中部署它,而是想为它创建一个模块.为此,我创建了文件夹JBOSS_HOME\modules\com\sun\Jersey\main,在这个文件夹中我放置了Jersey jar和文件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>
Run Code Online (Sandbox Code Playgroud)

为了防止使用jBoss JAX-RS,我从文件JBOSS_HOME\standalone\standalone.xml中删除了以下行:

<subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>
<extension module="org.jboss.as.jaxrs"/>
Run Code Online (Sandbox Code Playgroud)

在MyProjectEAR\META-INF文件夹中,我创建了具有以下结构的jboss-deployment-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>
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

出现在MyProject\webContent\META-INF\MANIFEST.MF的我的清单文件是这样的:

Manifest-Version: 1.0
Class-Path:
Run Code Online (Sandbox Code Playgroud)

当我尝试部署项目时,我收到以下错误:

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\""}}}}
Run Code Online (Sandbox Code Playgroud)

*编辑:*如果我将Jersey API放在JBOSS_HOME\modules\com\sun\jsf-impl\main中并更改相应的module.xml,一切正常.这个位置有什么不同?

小智 13

您需要在部署中指定对模块的依赖关系.

META-INF\MANIFEST.MF

Dependencies: com.sun.jersey
Run Code Online (Sandbox Code Playgroud)

另见https://docs.jboss.org/author/display/AS71/Class+Loading+in+AS7


Gon*_*oso 8

我需要补充一下

<subsystem xmlns="urn:jboss:domain:ee:1.0">
    <global-modules>
        <module name="com.sun.jersey" slot="main"/>
    </global-modules>
</subsystem>
Run Code Online (Sandbox Code Playgroud)

进入JBOSS_HOME\standalone\configuration\standalone.xml配置文件


Lin*_*abo 6

已经有一个答案,但是我想为以后的读者澄清一下这个话题。

三个位置中,将JBoss模块声明为JBoss 7(EAP 6)中其他部署的依赖项:

  1. 全局模块
  2. 清单文件
  3. jboss-deployment-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>
Run Code Online (Sandbox Code Playgroud)

2. MANIFEST.MF

将一个Dependencies条目添加到MANIFEST.MF文件中,并使用逗号分隔的依赖关系模块名称列表。

Dependencies: org.javassist, org.apache.velocity
Run Code Online (Sandbox Code Playgroud)

如果您使用的是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>
Run Code Online (Sandbox Code Playgroud)

注意:使用export可使com.foo.bar.test-module耳朵中所有捆绑的模块可见。

3. jboss-deployment-structure.xml

jboss-deployment-structure.xml是JBoss特定的部署描述符,可用于以细粒度方式控制类加载。应将其放置在META-INF(或用于Web部署的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>
Run Code Online (Sandbox Code Playgroud)

注意1:就像MANIFEST.MF一样,设置export=true使com.foo.bar.test-module在耳朵中捆绑的所有模块可见。

注2:该属性optional=true/false在jboss-deployment-structure.xml中也可用,但不适用于特定版本(可能<EAP 6.4.7)。如果需要,请签出。

希望能帮助到你。

资料来源

RedHat docs-向部署添加显式模块依赖项

RedHat文档-配置模块

RedHat文档-将模块添加到所有部署

JBoss AS 7开发人员指南