在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)中其他部署的依赖项:
- 全球模块
- MANIFEST.MF
- 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:属性 希望能帮助到你。 资料来源 : RedHat文档 – 向部署添加显式模块依赖项 RedHat docs – 配置模块 RedHat文档 – 向所有部署添加模块 JBoss AS 7开发人员指南 optional=true/false
在jboss-deployment-structure.xml中也可用,但对特定版本(可能是
如果使用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/*