集智平台jboss5部署中类隔离问题
在做V5项目部署JBOSS时遇到了不少问题,其中启动jboss5时出现了个这个错误:
ERROR [JBossContextConfig] XML error parsing: context.xml
org.jboss.xb.binding.JBossXBRuntimeException: Failed to create a new SAX parser at org.jboss.xb.binding.UnmarshallerFactory$UnmarshallerFactoryImpl.newUnmarshaller(UnmarshallerFactory.java:100)
在网上找了下错误,普遍说的是删除项目的lib文件夹下面的三个文件:xml-apis.jar、xerces-2.4.0.jar、xercesImpl.jar即可。
可是在V5中,如果删除了这些jar包,会导致读取v5核心配置文件时出错,导致整体不能使用,所以这种方法不可行。
最终发现是由于JBOSS的类装载问题引起,可采用JBOSS的类隔离机制。
在部署应用到JBoss服务器时,通常见到的问题就是应用所带的jar包与容器自己的jar包版本不同导致的冲突,以及应用间jar包导致的冲突,JBOSS提供两隔离机制:部署包之间的隔离、覆盖JBoss Server的类的隔离
对于这种隔离机制,通常是修改部署文件来进行(针对ear war sar三种方式有不同的配置,这里只针对war包),以下进行说明:
对于.war部署包,在web-inf下增加jboss-web.xml中定义如下:
<!DOCTYPE jboss-web PUBLIC “-//JBoss//DTD Web Application 5.0//EN”
“http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd”>
<jboss-web>
<class-loading java2ClassLoadingCompliance=”false”>
<loader-repository>
com.runqian:archive=fastreport.war
<loader-repository-config>
java2ParentDelegaton=false
</loader-repository-config>
</loader-repository>
</class-loading>
<context-root>/fastreport</context-root>
</jboss-web>
示例中,com.runqian:archive=fastreport.war代表jar仓库的对象名,其中,com.runqian可以随意取,fastreport.war就用部署包的名字即可,保证这一串唯一即可。
这样,不删除jar包得情况下,再次启动jboss5,则正常启动解决了该问题