在jBoss AS中创建模块

我正在使用jBoss AS 7发布我的各种项目,并且所有项目都使用Jersey API,因此我不想在每个项目中部署它,而是想为它创建一个模块。 为此,我创建了文件夹JBOSS_HOME \ modules \ com \ sun \ Jersey \ main,在这个文件夹中我放置了Jersey jar和文件module.xml:

                               

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

   

在MyProjectEAR \ META-INF文件夹中,我创建了具有以下结构的jboss-deployment-structure.xml文件:

              

我的MyProject \ webContent \ web.xml文件是这样的:

    MyProject     Jersey Servlet com.sun.jersey.spi.container.servlet.ServletContainer   javax.ws.rs.Application com.MyProject.service.REST_Application  1   Jersey Servlet /jaxrs/*   

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

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

META-INF \ MANIFEST.MF

 Dependencies: com.sun.jersey 

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

我需要补充一下

      

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

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

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

  1. 全球模块
  2. MANIFEST.MF
  3. JBoss的部署,structure.xml

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

1.全球模块

全局模块是JBoss企业应用程序平台6作为每个应用程序的依赖项提供的模块。 通过将任何模块添加到应用程序服务器的全局模块列表,可以使其成为全局模块。

您可以从管理控制台轻松添加全局模块(请参阅源代码),或者编辑standalone.xml:

       

2. MANIFEST.MF

使用逗号分隔的依赖项模块名称列表向MANIFEST.MF文件添加“ Dependencies项”条目。

 Dependencies: org.javassist, org.apache.velocity 

如果您使用的是Maven,则只需配置一些插件即可。 例如,对于耳朵。

  org.apache.maven.plugins maven-ear-plugin  6 ... lib    com.foo.bar.test-module export optional      ...    

注意:使用export可以使com.foo.bar.test-module对于捆绑在耳中的所有com.foo.bar.test-module可见。

3. jboss-deployment-structure.xml

jboss-deployment-structure.xml是一个特定于JBoss的部署描述符,可用于以细粒度的方式控制类加载。 它应该放在META-INF(或Web部署的WEB-INF)的顶级部署中

您可以从下面的文档中看到它与MANIFEST.MF相比有多强大。 对于最简单的情况,这是一个例子:

   false         

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

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

希望能帮助到你。

资料来源

RedHat文档 – 向部署添加显式模块依赖项

RedHat docs – 配置模块

RedHat文档 – 向所有部署添加模块

JBoss AS 7开发人员指南

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

  maven-war-plugin 2.2     com.sun.jersey     

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

我个人不得不使用这种方法来避免加载com.microsoft.jdbc.sqlserver.SQLServerDriver时出现的“Native Library xxxxxxx已经加载到另一个类加载器”错误,我已经将其定义为JBoss AS中的模块 – 这样JNDI定义的连接可以连接到MSSQL,同时我可以重用该依赖项直接连接到DB(这次是通过DriverManager而不是JNDI)。

我不是jboss-modules专家,但你可以尝试一些事情。

你说你把所有的JAR和module.xml放在JBOSS_HOME JBOSS_HOME\modules\com\sun\Jersey\main 。 注意资本J.我不知道它是否重要,但你至少要保持一致性,你可能想把它变成小写。

另外我认为你不想在jboss-deployment-structure.xml使用

再说一遍,我可能是错的,因为我绝对不是一个jboss-modules专家,但我会先尝试这两件事。

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

这样可以轻松进行更改,因为您可以创建批处理文件并运行它./jboss-cli.sh –file {path of file}

在web.xml中注释掉真正有效的init参数…

    MyProject     Jersey Servlet com.sun.jersey.spi.container.servlet.ServletContainer  1   Jersey Servlet /jaxrs/*