JBoss使用的是一种插件部署体系结构,独立的部署器负责部署不同类型的应用程序,使得部署体系结构模块化。
需要部署的应用程序,既可以是存档文件,也可以是已解压的目录。
如果是存档文件,则会在server/xx/tmp/deploy下解压此存档文件。
部署应用程序的替换机制是使用jboss.system:service=MainDeployer这个MBean的deploy或redeploy操作;
通过该操作甚至可以部署不在deploy目录下的应用程序,但重启后失效(若想要永久使用非deploy下的应用程序,可通过profile-service.xml配置)。
部署器通过deployers.xml和profile.xml进行配置
<!-- deployers.xml --> <deployment xmlns="urn:jboss:bean-deployer:2.0"> <!-- The MainDeployer --> <bean name="MainDeployer" class="org.jboss.deployers.plugins.main.MainDeployerImpl"> <property name="structuralDeployers"><inject bean="StructuralDeployers"/></property> <property name="deployers"><inject bean="Deployers"/></property> <property name="mgtDeploymentCreator"><inject bean="ManagedDeploymentCreator"/></property> <property name="comparator"><inject bean="topContextComparator"/></property> </bean>
JBoss支持热部署,部署扫描仪会定期扫描deploy目录。
可以设置让部署扫描仪同时扫描其它非deploy目录:
<!-- profile-service.xml --> <deployment xmlns="urn:jboss:bean-deployer:2.0"> <bean name="VFSDeployScanner" ...> <property name="URIList"> <list elementClass="java.net.URI"> <value>${jboss.server.home.url}deploy/ </value> <value>file:/opt/deploy/ </value> </list> </property> </bean>
——在哪个目录?
JBoss5.0引入了一个基于新虚拟文件系统(VFS, Virtual File System)的类加载程序。
JBoss使用多个类加载器,每个类加载器加载一组特定类,这样可以分离各种被部署的应用程序。
——【例】场景:不同的应用程序依赖相同的第三方jar,但版本号不同。使用不同的类加载程序,就可以加载各自的类版本。
实际上,一个类加载器对应一个应用程序。JMX中名称以“jboss.classloader:id=”开始。
除了类加载器,JBoss还维护数个加载程序存储库,即JBoss可以从中加载类的位置。
一个存储库可能被一个类加载器使用;而另一个存储库则可能被多个加载器使用。
用户可以为应用程序定义一个加载程序存储库,这样就会优先加载该库中的类。——【例】场景:不同的应用程序依赖相同的第三方jar,但版本号不同。
但其他应用程序则看不到这个存储库中的类(单面镜)。