Geronimo 标准配置有两个独立的 Web 层引擎:Jetty 和 Tomcat。Jetty 是预配备的,可以随时使用的。Sing Li 是经验丰富的 Tomcat 用户,他介绍了如何针对 Tomcat 重新配置 Geronimo,并且说明了使用 Geronimo 可以提供它的熟悉的基本功能,甚至还可以得到增强的功能。
Apache Jakarta Tomcat 一直是最新的 servlets 和 FSP 规范的参考容器实现。由于到处都遍布着它的优秀的开放源码程序,它已被世界范围内的用户广泛接受,并将其作为生产级、Web 层引擎,与业界标准 Web 服务器(如 Apache Web 服务器或 Microsoft? IIS)一起使用。令人振奋的消息是,最新版本的 Tomcat 5 引擎已经标准地与 Geronimo 捆绑在一起,随时可以激活。
尽管它是 Geronimo 的集成部分,但当前的架构不允许 Jetty 和 Tomcat 并行处理 Web 层。相反,Jetty 是默认的 JSP 和 servlet 引擎,而且您应该进行一些配置更改以激活 Tomcat 来代替 Jetty。
本文介绍如何在 Geronimo 中启用和配置 Tomcat 服务器。您将了解 Geronimo 的组件化架构是如何简化 Tomcat 的集成的,并进行一些动手操作,体验如何将 示例 Web 应用程序部署到 Tomcat,最后(但并不是最不重要的),您将学习如何利用 Geronimo/Tomcat 集成将 Tomcat Java? 身份验证和授权服务 (JAAS) 安全领域(realm)添加到使用 Geronimo 的基于容器的 JAAS 支持的示例应用程序。
Tomcat 作为备用的 Web 层容器集成在 Geronimo 中。要了解 Tomcat 是如何与 Geronimo 集成的,首先应简要回顾一下 Geronimo 的基于 GBeans 的架构。要了解本文介绍的这一架构的背景知识,请参阅“Geronimo! Part I: The J2EE 1.4 engine that could”(developerWorks,2005 年 5 月)。
Geronimo 容器可以帮助管理生命周期和名为 GBeans 的软件组件的运行时交互。在运行时,Geronimo 内核会用到 GBeans 的预制组,即所谓的配置(请参见侧栏 Geronimo GBeans 和配置)。配置是在部署过程中构建的。总体上来讲,开发人员可以获取 GBeans 的二进制代码(以代码模块的形式)和元数据信息(以 XML 部署计划的形式),然后对它们进行处理,以创建串行化的配置映像,此配置映像然后被持久存储到配置存储区。内核在配置开始时对映像进行反串行化处理。
图 1 举例说明了 Geronimo 配置是如何在部署时创建的以及是如何在运行时由内核启动的。
图 1. Geronimo 配置的部署和执行
在 图 1 中,您可以看到部署程序通过调用专用的 构造器(builder) 组件进行工作。专用构造器的主要角色是封装如何从特定类型的代码模块的元数据创建一个 Geronimo 工作配置的知识(例如,J2EE EAR 构造器知道如何从企业应用程序 EAR 文件中包含的代码模块和元数据创建 Geronimo 配置)。
图 2 提供了一个可以工作的 Geronimo 专用构造器的详细视图。
图 2. 专用构造器的操作
在 图 2 中,专用构造器处理传入的元数据(部署计划)并配置 GBeans(代码模块),创建一个配置作为输出,此配置可以由内核启动,而无需进一步的处理或配置。
根据部署的代码模块的类型,部署程序调用不同的专用构造器。例如,部署程序调用 Web 模块构造器来处理传入的 Web Applications aRchive (WAR) 文件。 图 1 显示了构造器在其操作过程中可能需要其他元数据(部署计划)。
从 图 1 可以观察并判断得出:
- Geronimo 内核/容器不是特定于 J2EE 的;它作为 GBeans 和配置的基础运行(请参见侧栏 Geronimo GBeans 和配置)。
- Geronimo J2EE 服务器只是专用服务配置(Web 层、业务层和企业信息系统层)及其关联的专用构造器的一个程序集。
- 通过创建 GBean 代码模块、专用构造器和关联的部署计划,您可以向 Geronimo 添加新配置。
它是一个重要的位置,在其之上,使得将 Tomcat 集成到 Geronimo 很直观。
当使用 Geronimo 部署程序部署 WAR 文件时,部署程序寻找专用 Web 模块构造器来创建配置。默认的 Geronimo 部署程序配置有用于此用途的 JettyModuleBuilder
硬布线。激活 Tomcat 时要执行的主要任务是,对部署程序重新布线以便换用 TomcatModuleBuilder
。 图 3 显示了这一情况。
图 3. 对部署程序重新布线以便使用 TomcatModuleBuilder,而不使用默认的 JettyModuleBuilder
在 图 3 中,由 TomcatModuleBuilder
创建的配置包含一个内嵌的 TomcatWebAppContext
。此上下文将由 TomcatContainer
用于在运行时启动 Web 应用程序。
Geronimo 部署程序由两个部署计划进行配置:
- j2ee-deployer-plan.xml
- j2ee-runtime-deployer-plan.xml
这两个部署计划存储在 Geronimo 源树的 modules/assembly/target/plans 目录中。如果深入观察这些部署计划,有大量的注释显示了您需要注释的 Jetty 参考和依赖项,以及必须取消注释的 Tomcat 参考和依赖项。认真按照这些要求将 Jetty 替换为 Tomcat。注意,您需要检查 Geronimo 的源代码来修改这些计划。请参见侧栏 服务器配置更改要求重新构建,了解服务器重新构建过程的讨论。
传统 Tomcat 中的服务器配置文件叫做 server.xml。它一般在 $CATALINA_HOME/ conf 目录下面,其中 $CATALINA_HOME 是 Tomcat 的安装目录。此配置文件描述了构成 Tomcat 服务器的嵌套组件。请参见 清单 1,了解简单的 server.xml。
清单 1. 简单的 server.xml Tomcat 配置文件
<Server port="8005" shutdown="SHUTDOWN"> <Service name="MyService"> <Connector port="8090"/> <Engine name="MyEngine" defaultHost="localhost"> <Host name="localhost" appBase="webapps"/> </Engine> </Service> </Server> |
在 清单 1 中,单一 Host 嵌套的组件配置在 Engine 容器组件中。优异 Service 组件配置了 Engine,并且 HTTP Connector 组件在端口 8090 监听传入请求。这是一个典型的 Tomcat 最小配置。
将 server.xml 转换成 j2ee-server-tomcat.xml
Geronimo 的 Tomcat 集成模块为多数 Tomcat 组件创建包装器 GBeans。结果,可以将上述 server.xml 转换为部署计划,该计划说明如何将基于 GBean 的组件连接在一起。这是作为 j2ee-server-tomcat.xml 服务器部署计划的一部分执行的,如 清单 2 所示。
清单 2. j2ee-server-tomcat.xml 中 Tomcat 容器的配置
<gbean name="MyTomcatContainer" class="org.apache.geronimo.tomcat.TomcatContainer"> <attribute name="catalinaHome">var/catalina</attribute> <reference name="engineGBean"> <name>TomcatEngine</name> </reference> <reference name="ServerInfo"> <module>org/apache/geronimo/System</module> <name>ServerInfo</name> </reference> </gbean> <gbean name="TomcatWebConnector" class="org.apache.geronimo.tomcat.ConnectorGBean"> <attribute name="initParams"> port=8090 </attribute> <reference name="TomcatContainer"> <name>MyTomcatContainer</name> </reference> </gbean> <gbean name="TomcatEngine" class="org.apache.geronimo.tomcat.EngineGBean"> <attribute name="className">org.apache.geronimo.tomcat.TomcatEngine</attribute> <attribute name="initParams"> name=MyEngine defaultHost=localhost </attribute> </gbean> <gbean name="TomcatHost" class="org.apache.geronimo.tomcat.HostGBean"> <attribute name="className">org.apache.catalina.core.StandardHost</attribute> <attribute name="initParams"> name=localhost appBase= workDir=work </attribute> <reference name="engineGBean"> <name>TomcatEngine</name> </reference> </gbean> |
您可以检查 j2ee-server-tomcat.xml 文件并查看默认的 Tomcat 服务器配置。该计划位于 Geronimo 源树的 modules/assembly/target/plans 目录中。
其他 Tomcat 嵌套的组件(如领域和 valves)通常出现在 server.xml 文件中。这些组件可以按同一方式布线到部署计划中。通过 Geronimo JAAS 领域保护 Really Big Pet Store 部分中的示例显示了如何将 JAAS 领域添加到引擎。
图 4 显示了 j2ee-server-tomcat.xml 部署计划如何用于构建作为 J2EE 服务器程序集的一部分而运行的 TomcatContainer
配置。
图 4. Tomcat 容器的配置和部署
在 图 4 中,GBeans 布线指令(类似于 清单 2)用于创建 Tomcat 服务器 (org/apache/geronimo/Tomcat) 配置。此配置导致 Geronimo 内核在运行时构建 Tomcat 组件层次结构,如图中右侧所示。
总之,您必须执行下面的步骤才能用 Tomcat 替换 Jetty:
- 下载并安装 Geronimo 源代码。
- 安装 Maven 和 Subversion;在构建源代码时必须使用这些工具(请参见 参考资料)。
- 按照上面的详细说明修改 j2ee-deployer-plan.xml、j2ee-runtime-deployer-plan.xml 和 j2ee-server-tomcat.xml 文件。
- 使用 Maven 构建自定义 Tomcat 程序集;这可以通过调用 Geronimo 源树的 modules/assembly 目录中的 Maven 完成。
- 启动服务器,确保您设置了 java.endorsed.dir 系统属性(即
java -Djava.endorsed.dir=lib/endorsed -jar bin/server.jar
)。之所以有必要这样做,原因是当前的 Geronimo 版本需要 JDK 1.4 JVM,并且默认情况下 Tomcat 所需的 XML 处理库没有包括在内。 - 如果尚未启动 Tomcat 服务器配置,请使用运行时部署程序启动它(即
java -jar bin/deployer.jar deploy org/apache/geronimo/Tomcat
)。
参见 服务器配置更改需要重新构建,了解将来的 Geronimo 版本可能提供的预配置的 Tomcat 程序集。
在启动激活 Tomcat 的 Geronimo 之后,便可以着手部署 EAR 和 WAR 文件,并可以让 Tomcat 宿主 Web 层应用程序组件(如 JSP 和 servlets)。
图 5 显示了部署到 Tomcat 的 Web 应用程序的部署描述符和部署计划。
图 5. Tomcat 部署描述符和部署计划
在 图 5 中,web.xml 标准 J2EE 部署描述符放置在部署的 WAR 文件中。TomcatModuleBuilder
在创建 Web 模块配置过程中处理此描述符。geronimo-tomcat.xml 文件是一个特定于 Geronimo 的部署计划,可以包括在 WAR 文件中,或者在部署过程中提供,如 图 5 所示。此部署计划由 TomcatModuleBuilder
处理,以便为 Web 应用程序创建上下文。与 Tomcat 的传统版本不同,不存在默认的 webapps 目录来保存所有应用程序。每个 Web 应用程序都在其自己的独立上下文中运行。在本例的稍后部分中您将看到一个 geronimo-tomcat.xml 计划。
表 1 简要介绍了 Geronimo 中 Tomcat 的部署描述符和部署计划。
表 1. Geronimo 中 Tomcat 的部署描述符和计划
文件名 | 类型 | 等效的 Tomcat 配置文件 | 描述 |
web.xml | 标准的 J2EE 部署描述符 | web.xml | Web 应用程序的标准描述符。必须作为 WAR 文件的一部分存储在 WEB-INF 子目录下。 |
geronimo-tomcat.xml | 特定于 Geronimo 的部署计划 | context.xml | 可以存储在 WAR 文件中或在部署过程中作为输入提供。此计划是可选的;如果未指定该计划,Tomcat 模块将使用默认的计划。 |
j2ee-server-tomcat-plan.xml | 用于 Tomcat 容器本身的特定于 Geronimo 的部署计划 | server.xml | 此计划配置 Geronimo 中 Tomcat 服务器的实例。该计划是服务器范围的,应用于在该服务器上运行的所有主机和应用程序。 |
在 表 1 中,如果在部署 Web 应用程序时没有包括 geronimo-tomcat.xml 部署计划,则 Geronimo 将使用默认的计划。此默认计划使用在 web.xml 中指定的应用程序名称或者 WAR 文件的基础名称创建 Tomcat 根上下文(如果在 web.xml 中没有指定应用程序名称)。
本例使用“Geronimo! Part 2: Tame this J2EE 1.4 bronco”(developerWorks,2005 年 5 月)一文中的代码。位于 war_only/dist 目录中的 reallybigpet.war 是一个 Web 应用程序,它包含:
- JSP
- Servlets
- JSTL 库
- 自定义标签库
要将此 Web 应用程序部署到 Tomcat,首先应确保 Tomcat 配置已启动:
java -jar bin/deployer.jar start org/apache/geronimo/Tomcat |
在得到提示时将 system
用作用户名,将 manager
用作密码。然后部署 reallybigpet.war 文件:
java -jar bin/deployer.jar deploy reallybigpet.war |
此 WAR 文件内部包含一个 web.xml 部署描述符。它不是使用自定义的 geronimo-tomcat.xml 部署计划进行部署的。使用 TomcatModuleBuilder
创建的默认计划就足够了。
要测试部署的 Really Big Pet Store 应用程序,请使用浏览器访问 URL http://localhost:8090/reallybigpet/store.cgi。
构造器使用名为 reallybigpet
的上下文创建了一个默认的部署计划。此上下文的名称基于 WAR 文件的名称。
通过 Geronimo JAAS 领域保护 Really Big Pet Store 的安全
在 Geronimo 内部,Tomcat 可以利用 Geronimo 的基于容器的 JAAS 支持来实现安全领域。如果仔细观察默认的 j2ee-tomcat-server.xml 配置文件,就会看到 Tomcat JAAS 领域已在引擎级别进行了配置,如 清单 3 中所示。JAAS 领域的引擎引用显示为粗体。
清单 3. 默认 j2ee-tomcat-server.xml 的片段,显示了在引擎级别配置的 JAAS 领域
<gbean name="TomcatEngine" class="org.apache.geronimo.tomcat.EngineGBean"> <attribute name="className">org.apache.geronimo.tomcat.TomcatEngine</attribute> <attribute name="initParams"> name=Geronimo defaultHost=localhost </attribute> <reference name="realmGBean"> <name>TomcatJAASRealm</name> </reference> </gbean> <gbean name="TomcatJAASRealm" class="org.apache.geronimo.tomcat.RealmGBean"> <attribute name="className"> org.apache.geronimo.tomcat.realm.TomcatJAASRealm</attribute> <attribute name="initParams"> userClassNames=org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal roleClassNames=org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal </attribute> </gbean> |
为了使用此领域确保 Really Big Pet Store 的安全,您需要向 <security-constraint>
元素添加 web.xml。在本示例代码的 war_realm/dd 目录中,您会发现包含安全代码的 web.xml。该 web.xml 文件显示在 清单 4 中。其中突出显示了安全代码。
清单 4. 部署描述符 - web.xml,使用 JAAS 领域来对用户进行身份验证
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<description>
developerWorks Really Big Pet Store Example - for Geronimo
</description>
<display-name>IBM developerWorks Really Big Pet Store Example for Geronimo</display-name>
<servlet>
<servlet-name>ReallyBigPetStore</servlet-name>
<servlet-class>com.ibm.dw.reallybigpet.StoreController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ReallyBigPetStore</servlet-name>
<url-pattern>/store.cgi</url-pattern>
</servlet-mapping>
<security-constraint>
<display-name>Pet Store Security Constraint</display-name>
<web-resource-collection>
<web-resource-name>Entire store</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Pet Store Login</realm-name>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
</web-app>
|
清单 4 中突出显示的代码可以根据 Geronimo 容器的默认 JAAS 提供程序对用户进行身份验证,这一过程是在其访问 Web 应用程序之前完成的。被身份验证的用户必须位于称为 admin
的角色/组中。这个默认的提供程序使用一组位于 var/security
目录下的属性文件。默认情况下,只定义了一个名为 admin
的组。此组只有一个用户,其用户名为 system
,密码为 manager
。
您可以在 war_realm/dist 目录中找到这个 Web 应用程序的安全版本,名称为 petsecure.war。可以使用以下方法将此应用程序部署到 Tomcat:
java -jar bin/deployer.jar deploy petsecure.war |
可以使用以下 URL 访问该 Web 应用程序:http://localhost:8090/petsecure/store.cgi。
此时,将会显示一个用于身份验证的登录对话框。通过用户名 system
和密码 manager
可访问存储区。
到目前为止,在没有使用自定义 geronimo-tomcat.xml 部署计划的情况下,我们已部署两个 Web 应用程序。 在下面的这个示例中,将使用自定义计划部署 reallybigstore.war。
自定义部署计划位于可下载源代码(参见 参考资料)的 custom_plan 目录中。该计划称为 custplan.xml,它可以将配置名称设置为 org/apache/geronimo/BigPetStore
,并将应用程序的上下文名称设置为 /Shopping.
:
清单 5. 自定义的特定于 Geronimo 的 Tomcat 部署计划 custplan.xml
<web-app
xmlns="http://geronimo.apache.org/xml/ns/web/tomcat"
xmlns:sec="http://geronimo.apache.org/xml/ns/security"
configId="org/apache/geronimo/BigPetStore">
<context-root>/Shopping</context-root>
<context-priority-classloader>false</context-priority-classloader>
</web-app>
|
在再次部署该应用程序之前,请确保反部署了上述示例。
使用自定义计划部署 Web 应用程序:
java -jar bin/deployer.jar deploy reallybigpet.war custplan.xml |
部署之后,便可以通过 URL:http://localhost:8090/Shopping/store.cgi 在其新上下文中访问该应用程序了。
如果使用部署程序的 list-modules 命令,您将会看到已部署的 org/apache/geronimo/BigPetStore 配置。
清单 6. 部署 custplan.xml 之后,部署程序的 list-modules 命令的输出
java -jar bin/deployer.jar list-modules
Found 19 modules
org/apache/geronimo/Tomcat
org/apache/geronimo/ActiveMQServer
org/apache/geronimo/J2EEDeployer
org/apache/geronimo/DefaultDatabase
org/apache/geronimo/SpringDeployer
org/apache/geronimo/Secure
org/apache/geronimo/DebugConsole
org/apache/geronimo/Server
org/apache/geronimo/DeployerSystem
org/apache/geronimo/ClientSystem
org/apache/geronimo/SystemDatabase
org/apache/geronimo/Client
org/apache/geronimo/SpringRuntime
org/apache/geronimo/SystemJMS
org/apache/geronimo/RuntimeDeployer
geronimo-demo-1.0-SNAPSHOT
org/apache/geronimo/System
org/apache/geronimo/BigPetStore
org/apache/geronimo/RemoteClassLoadingDeployer
|
最新的 Geronimo 版本包含 Tomcat 引擎,但是需要手动编辑配置文件并重新构建程序集才能激活。可以根据 Tomcat 容器部署并执行包含 JSP、servlets、过滤器和标签库的 Web 应用程序。当诸如 JAAS、事务和 Java 命名及目录接口(JNDI)之类的 Geronimo 服务得到完全集成后,就可以使用特定于 Tomcat 的功能(如虚拟主机、领域和 valves)。结合使用 Tomcat 和 Geronimo 可为您提供二者的非常好的功能 —— 可以将具有可管理和可扩展的开放源码 J2EE 服务器的最新创新与功能丰富、成熟的 Web 层容器的稳定性结合起来。