内容


在 Apache Geronimo 上远程部署 Web 应用程序

研究各种选项

Comments

远程部署和 JSR 88

远程部署是任何 J2EE 认证的应用服务器的重要特性之一。任务关键型应用服务器需要运行在专用的系统上。安全性也是许多系统必须关注的问题,所以会限制对系统的访问。受到限制的访问意味着应用程序不能在进行部署和运行的系统上进行构建和打包。

Java 社区认识到了远程部署的重要性。2000 年 10 月,引入了 Java Specification Request 88:Java Application Deployment(JSR 88)来解决这个问题。Java Community Process(JCP)通过 JSR 对应用程序的许多方面进行标准化。这种标准化的一个例子是应用程序的打包。Web 应用程序具有标准的布局并打包为 Web 应用程序存档(WAR)。这使应用程序开发人员在开发 Web 应用程序时不需要太多考虑在什么环境中部署应用程序。这是经典的 Java 格言 “一次编写,到处运行 ” 在企业部署方面的应用。

与通过 JCP 建立的其他 JSR 一样,JSR 88 是许多行业领先公司的代表之间协商的成果,比如 IBM®、Sun Microsystems、BEA 和 Oracle。这个规范引入了一种将任何 J2EE 应用程序部署到任何 J2EE 应用服务器的标准方式。它提供了部署(尤其是远程部署)的许多重要方面的细节,从而实现了标准化。它确定了应该如何识别和定位远程应用服务器,并为访问应用服务器建立了基本的安全模型。它还选定了应用服务器应该支持的几个核心部署阶段,比如部署、取消部署和重新部署。

许多工作成果集中在 JSR 88 中。这个规范的草案于 2001 年 10 月提交给 JCP。当然,在此之前,所有主流应用服务器厂商已经在自己的产品中提供了某种远程部署支持。不同的厂商采用不同的方法,因此关于如何对部署进行标准化有许多争论。JCP 拟订了一个草案,于 2002 年 1 月向公众发布。JSR 88 于 2002 年 6 月定稿并获得批准。自此之后,它在 2003 年进行了更新,并于当年随 Java Platform, Enterprise Edition(Java EE) 5 的发布再次更新。(关于 JSR 88 的更多细节和历史,请参阅本文后面的 参考资料。)

JSR 88 使独立软件厂商能够开发可以部署在任何 J2EE 认证应用服务器上的 J2EE 应用程序。当然,在支持 JSR 88 的同时,每个应用服务器的开发者可以添加额外的部署功能。例如,Apache Geronimo 通过它的 Geronimo 部署计划提供了许多高级部署特性。部署计划将关于应用程序的重要元数据告诉 Geronimo。对于 Web 应用程序,要做的重要事情之一是设置应用程序的上下文根。这样就很容易让应用程序出现在 http://<host> 这样的位置,而不需要在 URL 上提供额外路径。本文包含一个简单的 Web 应用程序,其中包含一个 Geronimo 部署计划(关于部署计划的更多信息,请参见 参考资料)。

Web 应用程序示例

为了了解远程部署在 Geronimo 上如何工作,最好有一个要部署的应用程序。图 1 显示本文使用的简单 Web 应用程序 remoteApp 的布局。

图 1. 简单 Web 应用程序 remoteApp 的文件结构
简单 Web 应用程序 remoteApp 的文件结构

这个应用程序只包含一个 Web 页面 index.jsp。清单 1 给出这个 Web 页面,这个页面显示 Hello World 以及当前时间。

清单 1. remoteApp 的 index.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" session="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>My Remote Web Application</title>
</head>
<body>
	Hello Remote World! The current time is: <%= new
 java.util.Date().toString() %>
</body>
</html>

这个应用程序使用 Ant 进行构建和打包。清单 2 给出构建脚本。它所做的仅仅是调用 Java jar 函数将应用程序打包为 .war 文件。为了对应用程序进行构建和打包,只需运行 ant buildwar

清单 2. 简单的 Ant 构建文件
<project name="remoteApp" basedir="." default="usage">
    <property name="src.dir" value="src"/>
    <property name="web.dir" value="war"/>
    <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
    <property name="name" value="remoteApp"/>
    <target name="build" description="Compile main source 
tree java files">
        <mkdir dir="${build.dir}"/>
        <javac destdir="${build.dir}" debug="true"
               deprecation="false" optimize="false" failonerror="true">
            <src path="${src.dir}"/>
            <classpath refid="master-classpath"/>
        </javac>
    	<copy todir="${build.dir}" preservelastmodified="true">
    		<fileset dir="${src.dir}">
    			<include name="**/*.hbm.xml"/>
    		</fileset>
    	</copy>
    </target>
    <target name="buildwar" depends="build"
 description="Builds application as a WAR file">
        <war destfile="${name}.war"
             webxml="${web.dir}/WEB-INF/web.xml">
            <fileset dir="${web.dir}">
                <include name="**/*.*"/>
            </fileset>
        </war>
    </target>
</project>

最后(但并非不重要),这个应用程序包含一个 Geronimo 部署计划。Geronimo 在释放 .war 文件时寻找部署计划。这个部署计划指定上下文根是 /helloRemote(见 清单 3)。因此能够在 http://<host>:<port>/helloRemote 访问这个 Web 应用程序。这个计划还给应用程序分配 IDHelloRemote

清单 3. remoteApp 的 Geronimo 部署计划
<web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.0"
         configId="HelloRemote">
    <context-root>/helloRemote</context-root>
   
<context-priority-classloader>false</context-priority-classloader>
</web-app>

有了这个简单的应用程序,现在就可以使用 Geronimo 的远程部署特性将应用程序部署到 Geronimo 的远程实例。进行远程部署有几种不同的方式;下一节讨论不同的方法以及它们如何工作。

Geronimo 上的远程部署

JSR 88 提出的规范是对任何 J2EE 1.4 应用服务器的要求,Apache Geronimo 完全实现了这个规范。Geronimo 提供了几种将应用程序部署到本地和远程系统的方式。它提供了一个命令行实用程序 —— Geronimo 部署工具。这个工具提供完整的 JSR 88 支持,甚至可以用于其他应用服务器。

Geronimo 还通过 Geronimo Administration Console 提供部署,这是一个供 Geronimo 管理员使用的 Web 应用程序。最后,可以在 Geronimo 上使用提供了 JSR 88 支持的其他第三方工具,比如流行的 Eclipse Web Tools Platform(更多信息见 参考资料)。本文讲解如何使用 Geronimo 部署工具部署示例应用程序,以及如何使用 Geronimo Administration Console 来检验它的部署。首先看看 Geronimo 部署工具。

Geronimo 部署工具

Geronimo 部署工具在 $GERONIMO_HOME/bin/deployer.jar 中。它提供 JSR 88 指定的所有选项以及 Geronimo 特有的额外选项,比如指定外部 Geronimo 部署计划。对于习惯使用命令行的系统管理员,这个工具是自然的选择,可以用于本地和远程部署。它的语法很简单:

java -jar deployer.jar <general_options> <command>
<command_options>

有几个启用远程部署的选项。--uri 选项允许使用 JSR 88 中定义的 URI 语法识别远程服务器。URI 像下面这样:

deployer:geronimo:jmx:rmi:///jndi/rmi:[//host[:port]]/JMXConnector

这允许指定远程服务器(主机)并可选地指定主机监听的端口。如果没有指定主机和端口,那么默认值分别是 localhost 和 1099。另外,也可以使用 --host--port 选项指定主机和端口。

当然,部署必须是安全的。因此,需要向部署工具提供用户名和密码作为凭证。使用 --user 选项指定用户名,使用 --password 选项指定密码。如果没有提供密码,那么部署工具会提示用户输入密码。

还可以使用部署工具对应用程序进行启动、停止和取消部署。它甚至可以用于其他 J2EE 应用服务器。为此,需要用 --driver 选项指定一个 JSR 88 兼容驱动程序 JAR。还可以将各种选项组合成一个部署脚本(一个简单的 XML 文件),然后将部署脚本传递给部署工具。

部署工具还有几个您应该知道的需求。本地机器需要打开它的 Remote Method Invocation(RMI)端口。默认端口是 1099。它还必须与远程服务器共享它的文件系统。这样远程服务器才能读取应用程序存档文件(常常是 EAR 或 WAR)。远程服务器也必须打开 RMI 端口和 HTTP 端口(默认情况下是 8080)。最后,它必须正在运行 remote-deploy Web 应用程序,这是 Geronimo 上默认包含和运行的程序。

在本文的后面,您将看到使用 Geronimo 部署工具将 remoteApp 部署在一个 Geronimo 远程实例上。在此之前,先看看另一种部署方式,Geronimo Administration Console。

使用 Geronimo Administration Console 进行远程部署

remote-deploy Web 应用程序允许使用 Geronimo Administration Console 进行部署(见 图 2)。可以从 http://<host>:<port>/console 访问 Geronimo Administration Console。

图 2. Geronimo Administration Console:欢迎页面
Geronimo Administration Console:欢迎页面
Geronimo Administration Console:欢迎页面

点击左边导航面板中 Applications 文件夹下面的 Deploy New 链接,见 图 3

图 3. Geronimo Administration Console:Deploy new application 屏幕
Geronimo Administration Console:Deploy new application 屏幕
Geronimo Administration Console:Deploy new application 屏幕

这允许上传应用程序的 .ear 或 .war 文件和部署计划。可以将 Geronimo 部署计划包含在 EAR 或 WAR 中,示例 Web 应用程序 remoteApp 中就是这么做的。也可以单独指定它。这对于已经部署在其他应用服务器上的应用程序是有用的。例如,如果有一个 Web 应用程序当前正在 JBoss 上运行,希望将它迁移到 Geronimo 上。使用这个选项,可以在 Web 应用程序 .war 文件之外的部署计划中编写任何特殊的 Geronimo 元数据,并对现有的 WAR 进行部署。

Geronimo Administration Console 是 Geronimo 部署工具的简单图形化替代品。这个控制台是一个 Web 应用程序,所以必须部署它(它是默认的),还必须安装一个 Web 容器(Tomcat 或 Jetty)。在某些生产系统上,可能不希望部署这个 Web 应用程序,因为它会使用一些资源,而且它提供的是已经通过命令行特性提供了的管理功能。另外,您在 Geronimo 上运行的应用程序可能根本不需要 Web 容器。在这种情况下,可以利用 Geronimo 的模块性,通过删除 Web 容器去掉这个应用程序。这可以释放一些资源,从而提高 Geronimo 的性能。但是,它对于开发人员仍然是好工具。在开发期间,另一个好办法是使用 Eclipse Web Tools Platform 和 Geronimo 插件(请参见 参考资料 中一篇解释这个方法的 developerWorks 文章的链接)。

使用 Eclipse Web Tools Platform 进行部署

J2EE 应用程序部署的标准化允许构建其他工具来提供部署功能,并支持各种应用服务器。还可以使用 Eclipse 的 Web Tools Platform 将应用程序部署到 Geronimo 的本地和远程实例上。在本节其余部分中,您将看到一个用来在 Geronimo 远程实例上进行部署的 Eclipse 示例。需要安装用于 Eclipse 的 Geronimo 插件(参见 参考资料 中的下载链接)。然后,在 Eclipse 中创建一个新的服务器实例(通常使用 New Server 向导),再指定要部署到这个服务器上的应用程序。

在默认情况下,这个向导使用 localhost 作为服务器的主机名,所以需要将它改为自己的远程主机名,见 图 4。注意,在本地机器上也需要安装 Geronimo,因为需要使用它的部署工具。在 图 4 中,本地已经安装了一个 Geronimo 运行时;如果不是这样,就需要使用 Installed Runtimes... 按钮设置它。

图 4. 步骤 1:选择要使用的 J2EE 服务器类型
步骤 1:选择要使用的 J2EE 服务器类型
步骤 1:选择要使用的 J2EE 服务器类型

图 5 显示连接任何 Geronimo 实例所需的常用信息,比如 Geronimo 使用的 Web、RMI 和 Enterprise JavaBeans(EJB)端口,以及安全凭证。

图 5. 步骤 2:指定连接 Geronimo 所需的参数
步骤 2:指定连接 Geronimo 所需的参数
步骤 2:指定连接 Geronimo 所需的参数

最后一步是选择要部署到服务器上的应用程序(见 图 6)。当然,可以选择其他应用程序来部署到 Eclipse 中配置好的任何服务器上。(关于设置 Eclipse、WTP 和 Geronimo 插件,然后使用 Eclipse 将应用程序部署到 Geronimo 上的详细说明,请参见 参考资料。)

图 6. 步骤 3:指定要部署的应用程序
步骤 3:指定要部署的应用程序
步骤 3:指定要部署的应用程序

既然已经讨论了进行远程部署的一些不同方法,就让我们使用 Geronimo 部署工具对示例应用程序进行部署。

部署示例:部署 remoteApp

这个示例使用 Apache Geronimo 部署工具。但是,使用 Administration Console 或 Eclipse 来部署这个应用程序也一样容易。在开发期间,选择哪种工具只是个人喜好问题,但是生产系统可能要求使用某种部署工具。

要使用部署工具,必须确保远程环境能够访问本地文件系统。在 Microsoft® Windows® 环境中,可以通过对网络驱动器进行映射来实现共享。在这个示例中,远程系统有一个映射的网络驱动器 Y:,它映射到本地系统的 %GERONIMO_HOME%/deploy 目录。这是一个合乎逻辑的选择,因为开发人员很可能先在本地对应用程序进行测试;所以应用程序可能已经放在这个目录中了。现在,进行部署的命令就很简单了:

java -jar %GERONIMO_HOME%/bin/deployer.jar --user system
--password manager --host aristotle deploy remoteApp.war

其中,aristotle 是远程服务器的名称。使用 --host 选项来指定远程主机而不是使用 URI。没有使用 --port 选项;因此 Geronimo 将使用默认的 RMI 端口 1099。应该会看到与 清单 4 相似的输出。

清单 4. 使用部署工具对示例应用程序进行远程部署
C:\dev\geronimo-1.0\deploy>java -jar %GERONIMO_HOME%/bin/deployer.jar 
--host aristotle --user system --password manager deploy remoteApp.war
    Uploading 1 file(s) to server

    File upload complete (Server: OK)

    1 file(s) transferred to server.  Resuming deployment operation.

    Deployed HelloRemote @ http://aristotle:8080/helloRemote

在部署应用程序之后,就可以登录到远程管理控制台并看到应用程序已经出现了(见 图 7)。

图 7. Geronimo Administration Console:安装的 Web 应用程序
Geronimo Administration Console:安装的 Web 应用程序
Geronimo Administration Console:安装的 Web 应用程序

为了看到已经安装的 Web 应用程序的列表,点击左边菜单中 Applications 文件夹下面的 Web App WARs 链接。应该会在列表的顶部看到 HelloRemote(这是 Geronimo 部署计划中为应用程序指定的 ID)。注意,Administration Console 显示 HelloRemote 正在运行,并提供了停止和卸载的功能。它还显示 Geronimo 上运行的其他 Web 应用程序。图 7 所示的列表显示正在 Geronimo with Jetty 默认安装上运行的所有标准 Web 应用程序。它包含 JavaServer Pages(JSP)和 servlet 示例。还记得前面提到的 remote-deploy Web 应用程序吗?在这个列表中也应该会看到它。

当然,确定您的 Web 应用程序正在运行的最容易的方法是,直接从 Web 浏览器访问它。在使用 Geronimo 部署工具部署示例应用程序时,它提供了 Web 应用程序的 URL。将这个地址输入浏览器中,应该会看到与 图 8 相似的显示。

图 8. 部署在远程服务器上的 remoteApp
部署在远程服务器上的 remoteApp
部署在远程服务器上的 remoteApp

图 8 所示的结果说明这个应用程序已经部署到了远程服务器上并正在运行。

结束语

远程部署是任何 J2EE 应用服务器的必要特性。它是使 Java 技术非常适合企业环境的原因之一。Geronimo 完全实现了 JSR 88,从而以标准化方式提供了远程部署功能。它还提供其他部署方法来简化应用程序的开发、部署和测试。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source, Java technology
ArticleID=156877
ArticleTitle=在 Apache Geronimo 上远程部署 Web 应用程序
publish-date=08312006