构建生产质量 EAR 文件的最佳实践
02/13/2008
摘要
简介
Java EE 应用程序组装和部署
Java EE 应用程序
- 企业 JavaBean (EJB) 模块
- Web 应用程序模块
- 应用程序客户端模块
- 资源适配器模块
weblogic.xml
部署描述符。以下图给出了三个最常见的应用程序组件的标准结构和部署描述符:EAR、WAR 和 EJB。 图 1. EAR 文件结构 | 图 2. WAR 文件结构 | 图 3. EJB 文件结构 |
为生产环境封装最佳实践
PS001:以开放格式部署应用程序
- WebLogic 能够更快地部署应用程序并且使用更少的资源(相对于存档格式)。这提高了操作的敏捷性。
- 它允许应用程序支持团队更加方便快速地对配置文件进行更改(相对于存档格式)。
PS002:EAR 中没有重复的 JAR 文件
- 系统类路径加载器
- WebLogic 服务器类路径加载器
- 应用程序类路径加载器
- EJB 类路径加载器
- Webapp 类路径
APP-INF/lib
中的 JAR 文件对于 Web 应用程序将是可见的。APP-INF/lib
和 WEB-INF/lib
中都不应该存在 JAR 文件。这增加了可交付程序的大小、增加了部署时间,并且可能会造成类加载问题和部署失败。APP-INF/lib
中定义,除非迫切需要为 EAR 文件中的不同模块部署不同版本的 JAR 文件。 PS003:EAR 中不得包含 JSP、未处理的/未编译的批注和源文件
tools.jar
也是不安全的。使用预编译的构件消除了配置编译器的需要,也减少了应用程序初始化时间,改善了用户初次访问时感觉到的应用程序响应时间。确保所有构件在构建时进行编译也就意味着在编译时(而不是应用程序已经部署后)识别和修复错误。 tools.jar
被留在类路径上,WebLogic Server 控制台应用程序本身如果没有正确处理的话,则和它有一个依赖关系。WebLogic Server 9 用户应该知道这一点。PS004:由系统或 WebLogic 类路径提供的 JAR 文件不应包括在 EAR 中
PS005:确保所有 EAR 文件都有一个 weblogic-application.xml
描述符。
weblogic-application.xml
描述符。如果 EAR 中包括 Web 应用程序模块,则必须显式定义 webapp.encoding.default
或 webapp.encoding.usevmdefault
以确保应用程序的可移植性,并消除应用程序使用的字符编码的任何模糊性。尽管在 Java EE 规范中不提供特定于容器的部署描述符是完全可以接受的,但是在实践中省略这些描述符可能会在容器的部署代码中暴露错误。 PS006:确保所有 WAR 文件都包括一个 weblogic.xml
描述符
weblogic.xml
部署描述符至少应该在以下元素中包含有效、非空的变量:- description
- weblogic-version
- jsp-descriptor
- page-check-seconds = -1
- precompile = false
- encoding = the applications encoding
- package-prefix = jsp_servlet
weblogic.xml
部署描述符的抵制总是令我吃惊。在向开发人员和他们的管理者解释为何包含此文件是一个不错的做法的时候,他们完全可以从 WebLogic 的例子中复制一个文件到源控制并部署应用程序。最终,未包含 weblogic.xml
部署描述符会导致一些我所见过的、接触过的所有版本的 WebLogic Server 的、最难以解决且代价高昂的部署失败。weblogic.xml
部署描述符。然而,当应用程序需要在开发人员自己 PC 以外的机器上运行的时候,就需要正确定义 security-role-assignment
元素。显然,该缺陷与应用程序有关,但它却是可能破坏部署这个问题的一个好例子。在许多组织中,没有理由假设负责应用程序部署的 WebLogic 管理员知道该元素需要的值应该是什么。然而,如果错误消息中包含了部署描述符,也许会为管理员提供一个诊断此问题的机会。PS007:确保所有 EJB 文件都包括一个 weblogic-ejb-jar.xml
描述符
weblogic-ejb-jar.xml
部署描述符至少应该在以下元素中包含有效、非空的变量:- description
- ejb-name
PS008:EAR 文件中不能包含构建构件
build.xml
或 pom.xml
文件等构建构件必须从所有可部署包中滤除。此规范确实是一个良好的管理措施;不用部署任何超出您需要的东西。在一个程序包中查找 build.xml
文件和 pom.xml
文件是一个散乱的构建过程。如果您的可交付程序将要发送给第三方,则其中还存在一个实际的安全问题。PS009:EAR 中不能包含测试构件
PS010:EAR 中不能包含静态内容
PS011:配置文件的命名和位置必须一致
PS012:EAR 中不能包含容器外部的 JAR 文件
PKS013:禁止使用 MANIFEST.MF 文件中的 Class-Path 头加载库
APP-INF/lib
文件夹中或者位于 EAR 文件部署描述符的 library-directory
元素定义所指定的目录中。 PS014:EAR 名称和版本控制必须符合公司的命名法
PS015:EAR 中的 Web 应用程序模块必须与它们的上下文根目录同名并以 .war 为扩展名
实现指导
PS003:删除未编译的文件
web.xml
文件中。<servlet>
<servlet-name>JSPClassServlet</servlet-name>
<servlet-class>weblogic.servlet.JSPClassServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JSPClassServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
PS005:包含 weblogic-application.xml
部署描述符。
weblogic-application.xml
描述符示例。<?xml version="1.0" encoding="UTF-8"?> <weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:j2ee="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-application.xsd"> <application-param> <param-name>webapp.encoding.default</param-name> <param-value>UTF-8</param-value> </application-param> </weblogic-application>
PS006:包含 web.xml
部署描述符。
web.xml
描述符示例。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<description>
The Monitor application is used by WhatsIt infrastructure for system validation testing.
</description>
<servlet>
<servlet-name>JSPClassServlet</servlet-name>
<servlet-class>weblogic.servlet.JSPClassServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JSPClassServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
</web-app>
PS007:包含 web.xml
部署描述符。
weblogic-ejb-jar.xml
描述符示例:<?xml version="1.0" encoding="UTF-8"?>
<weblogic-ejb-jar xmlns="http://www.bea.com/ns/weblogic/90" xmlns:j2ee="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-ejb-jar.xsd"> <weblogic-enterprise-bean> <description>Example EJB</description> <ejb-name>BeanManagedAccountEJB</ejb-name> .... <weblogic-ejb-jar>
PS010:EAR 中不能包含静态内容
<Webapp Content>
|--css
|--p_w_picpaths
|--index.html
index.html
文件应该将用户重定向到 Web 应用程序模块的 web.xml
文件的 <welcome-file list> 元素的值。例如,如果 webapp 模块使用 JSF,则 index.html
应如下所示:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Redirect to JSF controller</title> <meta http-equiv="REFRESH" content="0;url=http://mydomain.com/webapp/index.faces"/> </head> <body> </body> </html>
PS011:配置文件的名称和位置
env.properties
的文件中。这些文件都必须位于 APP-INF/lib/classes
下。实现封装最佳实践
总结
资源
- Java Platform, Enterprise Edition 5 specification — 其中一节的主题为部署。