Java 在jbossas中创建模块

Java 在jbossas中创建模块,java,deployment,configuration,jersey,jboss7.x,Java,Deployment,Configuration,Jersey,Jboss7.x,我使用JBossAS7发布我的各种项目,它们都使用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.jers

我使用JBossAS7发布我的各种项目,它们都使用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>
当我尝试部署该项目时,出现以下错误:

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,一切正常。这个位置有什么不同?

我不是jboss模块专家,但有几件事你可以试试

你说你把所有的JAR和module.xml放在
JBOSS\u HOME\modules\com\sun\Jersey\main
中。注意大写字母J。我不知道这有什么关系,但为了保持一致性,至少您可能希望将其小写

另外,我认为您不希望在
jboss部署结构.xml
中使用


同样,我可能错了,因为我肯定不是jboss模块专家,但我会先尝试这两件事。

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

META-INF\MANIFEST.MF

Dependencies: com.sun.jersey
另请参见我需要添加的内容

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

注释掉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>

我的项目
泽西Servlet
com.sun.jersey.spi.container.servlet.ServletContainer
1.
泽西Servlet
/jaxrs/*

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


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

如果使用Maven,您可以在jboss中添加对模块的引用,如下所示:

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

maven战争插件
2.2
泽西岛
这将自动为您生成清单条目


我个人必须使用这种方法来避免在加载我在JBoss as中定义为模块的com.microsoft.jdbc.sqlserver.SQLServerDriver时出现“本机库xxxxxxx已加载到另一个类加载器”错误-这样JNDI定义的连接可以连接到MSSQL,同时,我可以重用该依赖关系直接连接到DB(这次是通过DriverManager而不是JNDI)。

已经有了答案,但我想为将来的读者澄清一下这个主题

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

  • 全局模块
  • MANIFEST.MF
  • 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>
    
    如果您使用的是Maven,您只需要配置一些插件。 e、 耳塞

    <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>
    
    注1:与MANIFEST.MF一样,设置
    export=true
    使
    com.foo.bar.test模块对ear中捆绑的所有模块可见

    注2:jboss-deployment-structure.xml中也提供了属性
    optional=true/false
    ,但对于特定版本(可能 希望能有帮助

    来源


    当我在这里键入路径时,大写字母J只是一个错误;)尝试删除,但仍然不起作用:(可能尝试在jboss-deployment-structure.XML中放入一些不好的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>
    
    <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>
    
    <subsystem xmlns="urn:jboss:domain:ee:1.0" >            
      <global-modules>
        <!-- Add global modules here -->
        <module name="org.javassist" slot="main" />            
      </global-modules> 
    </subsystem>
    
    Dependencies: org.javassist, org.apache.velocity
    
    <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>
    
    <?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>