IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Open source | Java technology | Web development  >

发挥 Tomcat 在 Geronimo 中强大功能

探索 Tomcat 引擎适用于 Geronimo 的方式,并简要介绍其丰富的功能集

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论

样例代码


级别: 初级

Sing Li (westmakaha@yahoo.com), 自由作家

2005 年 7 月 18 日

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 支持的示例应用程序。

Geronimo 的架构回顾

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 配置的部署和执行
Geronimo 配置的部署和执行
Geronimo GBeans 和配置

在部署过程中,GBean 组件群被打包在一个配置中。Geronimo 内核只能理解配置。配置是您应运行的一些东西(例如,应用程序、服务包或者一些简单的 JAR 文件集),因为您不希望始终管理个别组件。一个系统一般有许多紧密耦合的组件,然后这些组件再与另一个系统松散耦合。一般情况下,对每个紧密耦合的组都存在一个配置。

图 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 很直观。





回页首


集成 Tomcat Web 模块构造器

当使用 Geronimo 部署程序部署 WAR 文件时,部署程序寻找专用 Web 模块构造器来创建配置。默认的 Geronimo 部署程序配置有用于此用途的 JettyModuleBuilder 硬布线。激活 Tomcat 时要执行的主要任务是,对部署程序重新布线以便换用 TomcatModuleBuilder图 3 显示了这一情况。


图 3. 对部署程序重新布线以便使用 TomcatModuleBuilder,而不使用默认的 JettyModuleBuilder
对部署程序重新布线以便使用 TomcatModuleBuilder,而不使用默认的 JettyModuleBuilder
服务器配置更改要求重新构建

在使用 java -jar server.jar 运行服务器时,您实际上便启动和运行了一组固定的预制配置。此类预制的配置集在 Geronimo 中称为程序集。 创建此程序集的步骤是 Geronimo 构建过程的最后一步。由于部署程序配置和 Tomcat 服务器配置是该程序集的一部分,因此不重新创建程序集是不可能对它们进行更改的(例如用 Tomcat 取代 Jetty)。目前,这意味着您必须具有检查和设置 Geronimo 构建过程的源代码,才能切换到 Tomcat。在未来的 Geronimo 发行版中,有望提供已经激活了 Tomcat 的预制服务器程序集。

图 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 容器

传统 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 领域添加到引擎。

Tomcat 服务器组件层次结构的运行时布线

图 4 显示了 j2ee-server-tomcat.xml 部署计划如何用于构建作为 J2EE 服务器程序集的一部分而运行的 TomcatContainer 配置。


图 4. Tomcat 容器的配置和部署
Tomcat 容器的配置和部署

图 4 中,GBeans 布线指令(类似于 清单 2)用于创建 Tomcat 服务器 (org/apache/geronimo/Tomcat) 配置。此配置导致 Geronimo 内核在运行时构建 Tomcat 组件层次结构,如图中右侧所示。

总之,您必须执行下面的步骤才能用 Tomcat 替换 Jetty:

  1. 下载并安装 Geronimo 源代码。
  2. 安装 Maven 和 Subversion;在构建源代码时必须使用这些工具(请参见 参考资料)。
  3. 按照上面的详细说明修改 j2ee-deployer-plan.xml、j2ee-runtime-deployer-plan.xml 和 j2ee-server-tomcat.xml 文件。
  4. 使用 Maven 构建自定义 Tomcat 程序集;这可以通过调用 Geronimo 源树的 modules/assembly 目录中的 Maven 完成。
  5. 启动服务器,确保您设置了 java.endorsed.dir 系统属性(即 java -Djava.endorsed.dir=lib/endorsed -jar bin/server.jar)。之所以有必要这样做,原因是当前的 Geronimo 版本需要 JDK 1.4 JVM,并且默认情况下 Tomcat 所需的 XML 处理库没有包括在内。
  6. 如果尚未启动 Tomcat 服务器配置,请使用运行时部署程序启动它(即 java -jar bin/deployer.jar deploy org/apache/geronimo/Tomcat)。

参见 服务器配置更改需要重新构建,了解将来的 Geronimo 版本可能提供的预配置的 Tomcat 程序集。

Tomcat 应用程序部署描述符和部署计划

在启动激活 Tomcat 的 Geronimo 之后,便可以着手部署 EAR 和 WAR 文件,并可以让 Tomcat 宿主 Web 层应用程序组件(如 JSP 和 servlets)。

图 5 显示了部署到 Tomcat 的 Web 应用程序的部署描述符和部署计划。


图 5. Tomcat 部署描述符和部署计划
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.xmlWeb 应用程序的标准描述符。必须作为 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 可访问存储区。

使用自定义部署计划将 Web 应用程序部署到 Tomcat

到目前为止,在没有使用自定义 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 层容器的稳定性结合起来。





回页首


致谢

真诚感谢 Jeff Genender,他是 Geronimo 小组中 Tomcat 集成的主要开发人员,对本文提出了许多有价值的建议。






回页首


下载

描述名字大小下载方法
Web application deployable on Tomcat (or Jetty)os-ag-tomcat_code.zip128 KBHTTP
关于下载方法的信息


参考资料



关于作者

Sing Li

Sing 是一名顾问和多产的作家,有二十多年的行业经验。他编写了 Beginning JavaServer PagesProfessional Apache Tomcat 5Pro JSP -- Third Edition、Early Adopter JXTA, Professional Jini、Beginning J2ME: From Novice to Professional, Third Edition 和许多其他书籍。Sing 还为一些技术杂志投稿,并参加一些开放源码社区。他是开放源码、VOIP 和 P2P 运动的倡导者。您可以通过 westmakaha@yahoo.com 与 Sing 联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

将您的建议发给我们或者通过参加讨论与其他人分享您的想法.




回页首


The following terms are trademarks of International Business Machines Corporation in the United States, other countries, or both:

  • IBM?
Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both. Microsoft is a registered trademark of Microsoft Corporation in the United States, other countries, or both. 其他公司、产品或服务的名称可能是其他公司的商标或服务标志。

IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款