原文地址:http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/ch01s04s02.html
大多数JavaEE应用是发布成EAR归档文件的。一个EAR归档文件是一个JAR文件,其典型表现是包含了一个WAR归档文件(处理web页面,servlet以及web相关的组件)以及一个或多个提供EJB3服务(如数据访问与事务)的JAR文件,和另外一些支持应用正常运行的JAR文件。另外一个EAR文件也拥有部署描述文件例如applocation.xml和jboss-app.xml。下面是一个典型EAR应用的基础结构
myapp.ear |+ META-INF |+ applications.xml and jboss-app.xml |+ myapp.war |+ web pages and JSP /JSF pages |+ WEB-INF |+ web.xml, jboss-web.xml, faces-config.xml etc. |+ lib |+ tag library JARs |+ classes |+ servlets and other classes used by web pages |+ myapp.jar |+ EJB3 bean classes |+ META-INF |+ ejb-jar.xml and persistence.xml |+ lib |+ Library JARs for the EAR
需要注意一点的是,不像许多其它的应用服务器,在JBossAS应用服务器中,你不需要为了让WAR文件能访问EJB3服务而在web.xml文件中声明EJB引用。你可以直接通过JNDI来获得引用。
下面是一个典型的application.xml文件。它声明了在EAR中的WAR与EJB3的JAR文件,以及为应用定义了web内容的根目录。当然,你可以在同一个EAR应用存放多个EJB3模块。在这个EAR应用中,application.xml文件也可以为这些jar文件选择性地定义一个共用的类路径。在JBossAS中,这个JAR文件路径默认为"lib",但这个路径在其它应用服务器中可能会不同
<application> <display-name>My Application</display-name> <module> <web> <web-uri>myapp.war</web-uri> <context-root>/myapp</context-root> </web> </module> <module> <ejb>myapp.jar</ejb> </module> <library-directory>lib</library-directory> </application>
而jboss-app.xml文件则为EAR应用提供了特属于JBoss的部署配置方法。例如,它可以在EAR中指定模块的部署顺序、部署特属于JBoss的应用模块如SAR文档(Service ARchive for MBeans)和HAR文档(Hibernate ARchive for Hibernate objects)、提供可用于该应用的安全域和JMX MBean等等。你可以参考以下DTD来获取jboss-app.xml的更多属性:
http://www.jboss.org/j2ee/dtd/jboss-app_4_2.dtd.
一个jboss-app.xml的公用例子是配置关于该EAR文件是否要部署在它特有范围的类加载器中,用以防止和其它应用的命名冲突。如果你的EAR应用是部署在自己拥有的类加载器并且在其EJB3的JAR文件中只有一个persistence-unit,那你就可以使用@PersistenceContext EntityManager来注入EntityManager到session beans,而无需考虑得传递persistence unit的名称给@PersistenceContext注释。下面的jboss-app.xml为EAR应用标识了一个一定范围的类加载器 myapp:archive=myapp.ear
<jboss-app> <loader-repository> myapp:archive=myapp.ear </loader-repository> </jboss-app>
EAR部署由JBOSS_DIST/server/default/deploy/ear-deploy.xml文件来配置,此文件包含以下三个属性
<server> <mbean code="org.jboss.deployment.EARDeployer" name="jboss.j2ee:service=EARDeployer"> <!-- A flag indicating if ear deployments should have their own scoped class loader to isolate their classes from other deployments. --> <attribute name="Isolated">false</attribute> <!-- A flag indicating if the ear components should have in VM call optimization disabled. --> <attribute name="CallByValue">false</attribute> <!-- A flag the enables the default behavior of the ee5 library-directory. If true, the lib contents of an ear are assumed to be the default value for library-directory in the absence of an explicit library-directory. If false, there must be an explicit library-directory. --> <attribute name="EnablelibDirectoryByDefault">true</attribute> </mbean> </server>
如果你设置了Isolated为true,所有的EAR部署默认都会拥有范围内的类加载器。因此不需要去定义jboss-app.xml文件中的classloader了。CallByValue 指明我们是否要把所有EJB调用都当成远程调用。远程调用比本地 call-by-reference调用要花费另外的花销,因为参与远程调用的对象需要序列化和反序列化。对于我们大多数的应用来说,WAR与EJB3的JAR是部署在同一个服务器上的,因此该值因该默认为false,并让服务器在同一个JVM中使用本地 call-by-reference调用来援用EJB方法。 EnablelibDirectoryByDefault属性指明在EAR归档文件中的lib目录是否要成为共享JAR文件的路径。