【问题标题】:Creating module in jBoss AS在 jBoss AS 中创建模块
【发布时间】:2012-03-29 12:26:23
【问题描述】:

我正在使用 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>

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

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

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

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

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

【问题讨论】:

    标签: java deployment configuration jersey jboss7.x


    【解决方案1】:

    您需要在部署中指定对模块的依赖。

    META-INF\MANIFEST.MF

    Dependencies: com.sun.jersey
    

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

    【讨论】:

      【解决方案2】:

      我需要添加

      <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 配置文件

      【讨论】:

        【解决方案3】:

        已经有了答案,但我想为未来的读者稍微澄清一下这个话题。

        三个地方可以将 JBoss 模块声明为 JBoss 7 (EAP 6) 中其他部署的依赖项:

        1. 全局模块
        2. 清单.MF
        3. jboss-deployment-structure.xml

        在大多数情况下,它们是替代品

        1.全局模块

        全局模块是 JBoss 企业应用程序平台 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

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

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

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

        注意 2:属性 optional=true/false 在 jboss-deployment-structure.xml 中也可用,但不适用于特定版本(可能

        希望对你有帮助。

        来源

        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

        【讨论】:

          【解决方案4】:

          如果使用 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>
          

          它将自动为您生成清单条目。

          我个人必须使用这种方法来避免“本机库 xxxxxxx 已在另一个类加载器中加载”错误,同时加载我已定义为JBoss AS - 这样 JNDI 定义的连接可以连接到 MSSQL,同时我可以重用该依赖项直接连接到数据库(这次是通过 DriverManager 而不是 JNDI)。

          【讨论】:

            【解决方案5】:

            我不是 jboss-modules 专家,但您可以尝试一些方法。

            你说你把所有的 JAR 和 module.xml 放在JBOSS_HOME\modules\com\sun\Jersey\main 中。请注意大写的 J。我不知道它是否重要,但为了保持一致性,您至少可能希望将其设为小写。

            另外,我认为您不希望 &lt;include path="**"/&gt;jboss-deployment-structure.xml 中。

            同样,我可能错了,因为我绝对不是 jboss-modules 专家,但我会先尝试这两件事。

            【讨论】:

            • 当我在这里输入路径时,大写的 J 只是一个错误;) 尝试删除 但它仍然不起作用:(
            • 也许可以尝试在 jboss-deployment-structure.xml 中放入一些错误的 XML,看看它是否正在被处理。也许问题的一部分就在那里。同样,这只是一个猜测。
            【解决方案6】:

            也可以通过 CLI 界面添加全局模块。

            这使得更改变得容易,因为您可以创建一个批处理文件并运行它。/jboss-cli.sh --file {path to file}

            【讨论】:

              【解决方案7】:

              注释掉 web.xml 中真正起作用的 init 参数...

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-05-10
                • 1970-01-01
                • 1970-01-01
                • 2011-12-11
                • 2014-07-16
                相关资源
                最近更新 更多