多个依赖Netty3的应用在同一个Wildfly服务器上的布署冲突问题分
最近项目里遇到一个问题,就是在wildfly-8.1.0的同一个server上布署多个war,且这几个war中都依赖了netty3,导致只能有一个war包成功,经过排查,发现是jboss服务器本身的一个bug(https://issues.jboss.org/browse/IMMUTANT-144),原因是jboss本身对相同的"拓展"只能注册一次,而netty3中的jboss-beans.xml是提供插件服务的,多次扫描注册的话就会报DuplicateServiceException。 具体分析过程如下 启动过程的异常:
Internal Server Error { "outcome" => "failed","result" => undefined,"failure-description" => "JBAS010839: Operation failed or was rolled back on all servers.","rolled-back" => true,"server-groups" => {"main-server-group" => {"host" => {"master" => {"server-one" => {"response" => { "outcome" => "failed","failure-description" => {"JBAS014671: Failed services" => {"jboss.deployment.unit. "wd-web-in.war".INSTALL" => "org.jboss.msc.service.StartException in service jboss.deployment.unit."wd-web-in.war".INSTALL: JBAS018733: Failed to process phase INSTALL of deployment "wd-web-in.war" Caused by: org.jboss.msc.service.DuplicateServiceException: Service jboss.pojo. "org.jboss.netty.internal.LoggerConfigurator".DESCRIBED is already registered"}},"rolled-back" => true }}}}}} }根据异常里的 org.jboss.netty.internal.LoggerConfigurator关键词查询到Jboss的bug单 https://issues.jboss.org/browse/IMMUTANT-144
中文解释是"错误发生在部署两个应用程序都依赖于io.netty/netty" Jim Crossley在下面给出的解决方案是“Removed the pojo subsystem from standalone.xml. This prevents random jboss-beans.xml files from being discovered/deployed. The netty jar contains one.”中文意思就是“从standalone.xml删除pojo subsystem,这可以防止任意的jboss-beans.xml文件被发现/部署,netty的jar包含一个”。 这里给出Netty3的Jar包与Netty4的Jar的一个对比:
很明显netty3中多了一个jboss-beans.xml文件,这里有一个问题,netty3.5中jboss-beans.xml的作用是什么? 查了资料说是类似于plugin.xml一样的作用,也就是插件的加载,netty3中的jboss-beans.xml内容如下: <deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_2_0.xsd" xmlns="urn:jboss:bean-deployer:2.0"> <bean name="org.jboss.netty.internal.LoggerConfigurator" class="org.jboss.netty.container.microcontainer.NettyLoggerConfigurator" /> </deployment>也就是因为这个被重复注册的Bug,这个bug在是由于安装的extension <extension module="org.jboss.as.pojo"/> 导致的,可以从这个pojo切入解决,也可以直接把依赖的netty3 Jar包里的jboss-beans.xml删除,将删除的包放在webappWEB-INFlib目录下
问题是这个pojo的作用是什么?官方文档的解释如下
使应用程序的部署包含JBoss Microcontainer服务,支持的早期版本的JBoss应用程序服务器,也就是说可有可无。那就删除吧,在对应的模式(profile)下找到<subsystem xmlns="urn:jboss:domain:pojo:1.0"/> 然后删除,重启server,发现可以布署了。 设置Profile
设置布署在同一个逻辑服务结点上:
启动服务 jboss-deployment-structure.xml的作用:防止服务器自动添加一些依赖关系 内容如下: <jboss-deployment-structure> <deployment> <!-- --> <exclude-subsystems> <subsystem name="pojo" /> </exclude-subsystems> <!-- Exclusions allow you to prevent the server from automatically adding some dependencies --> <exclusions> <module name="org.slf4j" /> <module name="org.sl4j.jcl-over-slf4j" /> <module name="org.slf4j.impl" /> <module name="org.jboss.logging.jul-to-slf4j-stub" /> <module name="io.netty" /> <module name="org.jboss.netty" /> </exclusions> </deployment> </jboss-deployment-structure>可以避免应用中引用了Netty导致的和Jboss的重复冲突问题 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |