本文逐步地指導您將一個應用程序部署到 Tomcat 6.0,然後遷移代碼並將其部署到 WebSphere® Application Server Community Edition V2.1。該示例應用程序突出說明了這兩種實現之間的一些顯著差異。
引言
|
IBM WebSphere Application Server Community Edition(以下稱為 Community Edition)是一個 Java™ Enterprise Edition 5 (Java EE5) 認證應用程序伺服器,其中包含用於數據 (Apache Derby)、消息服務 (Active MQ)、Web 服務 (Apache Axis) 等的集成組件。
Community Edition 是使用 Geronimo Beans (GBean) 體系結構來構建的,並將 Apache Geronimo 作為其核心。Community Edition 的很小內存佔用空間、易用性、免費可用性和 IBM 世界級的可選支持,使其對於中小型組織的來說非常理想。
Apache Tomcat 是由 Apache Software Foundation 開發的 Web 容器。它實現了 Java Servlet 和 Java Server Pages API。Tomcat Version 6.0.x 實現了 Java Servlet 2.5 和 Java Server Pages 2.1 API。
雖然本文將指導您把一個示例應用程序從 Tomcat 6.0.x 遷移到 Community Edition 2.1,但是從 Tomcat 5.x 進行遷移也是非常相似的。Tomcat Version 5.x 實現了 Java Servlet 2.4 和 Java Server Pages 2.0 API,並且 Community Edition 2.1 與這些版本向後兼容。然而,在如何定義配置方面可能存在一些差異。
本文指導您將一個在 Apache Tomcat 上開發的應用程序遷移到 Community Edition。我們在 Tomcat 和 Community Edition 上使用了 Eclipse IDE 來進行應用程序開發。本文將按以下部分進行組織:
體系結構分析——相似性和區別
如圖 1 所示,Community Edition 遵循組件體系結構。它包含來自各個開放源代碼社區的最佳品種的開放源代碼產品。Apache Tomcat 是 Community Edition 的預設 Web 容器,因此您可以容易地將 Tomcat 上開發的應用程序遷移到 Community Edition。
在使用 Community Edition 時,您將使用與 Tomcat 的獨立版本相同的 Tomcat 伺服器。因此,您不需要針對 Community Edition 重新對應用程序打包。然而,在將應用程序從 Tomcat 遷移到 Community Edition 時,您需要解決它們之間存在的一些差異。出現這些差異的原因在於,Tomcat 是作為 Community Edition 中的一個服務來部署的,以提供可用於 Java EE5 認證應用程序伺服器的功能;而不只是一個 Servlet 容器。Community Edition 中的 Tomcat 與其他已部署的容器服務集成在一起,例如:
為了克服大多數遷移問題,您需要弄清 Tomcat 中的每個服務如何映射並應用到 Community Edition。Tomcat 的基本體系結構是相同的,但是在 Community Edition 中將其定義為一個 gbean。這種實現使得更新版本的 Tomcat 能夠容易地集成到將來的 Community Edition 版本中。
下表說明了獨立 Tomcat 與運行在 Community Edition 中的 Tomcat 之間的主要區別和相似之處:
功能 | Tomcat | Community Edition |
---|---|---|
Java Servlet | 實現 Servlet 2.5 API | 實現 Servlet 2.5 API |
Java Server Pages | 實現 JSP 2.1 API | 實現 JSP 2.1 API |
JNDI | 一般通過 server.xml 進行手動配置 | JNDI 能夠訪問由 Geronimo 內核管理的對象引用 |
JMS | 在 context.xml 中進行手動配置 | 可以使用基於 Web 的 GUI 來創建 JMS 資源 |
JDBC 數據源 | 在 context.xml 中進行手動配置 | 可以使用基於 Web 的 GUI 來創建 JDBC 資源 |
Web 服務 (Apache Axis) | Axis.war 的部署引入 WebServices 功能 | Axis 已預先集成到 Community Edition 中。 |
安全領域 | 使用 server.xml 或 context.xml 文件進行配置 | 支持容器管理的領域,這些領域可用於所有組件的授權。還可以定義單獨的組件領域。 |
多個連接器 | 多個協議處理程序訪問同一個引擎。HTTP 連接器可以與同一個引擎上的 SSL 連接器一起工作 | 可以使用管理控制台來配置各個連接器,包括 HTTP、SSL 以及用於負載平衡和集群的 Apache JServ 協議 (AJP13) |
虛擬主機 | 支持在同一個 IP 地址上承載不同的網站。可以使用 server.xml 來對此進行配置 | 可以通過配置config.xml 實現相同的功能 |
部署描述符 | web.xml 是 J2EE Web 應用程序 (WAR) 的預設部署描述符 | web.xml 是 J2EE Web 應用程序 (WAR) 的預設部署描述符 |
部署計劃 | 沒有特定於供應商的部署描述符 | Community Edition 具有特定於 Geronimo 的部署描述符,用於配置特定於 Geronimo 的服務。對於 Web 應用程序,geronimo-web.xml 是部署計劃。 |
在 Community Edition 中,大多數配置可以使用以下部署計劃之一來完成:geronimo-web.xml、config.xml 或 config-substitution.properties。您還可以使用基於 Web 的管理控制台添加資源,例如 JMS 隊列、連接工廠和 JDBC 數據源。該控制台簡化了配置管理,而在 Tomcat 中則是使用 server.xml 和 context.xml 進行手動配置。
關於示例應用程序
我們從 Tomcat V6.0.x 遷移到 Community Edition V2.1 的示例應用程序是使用了以下組件的通用商店應用程序:
該應用程序還使用預設的 Tomcat UserRealm 對用戶進行身份驗證,而 Community Edition 則使用預設的 geronimo-admin 領域。
本文包括的示例應用程序由單個 WAR 模塊組成,其中包含以下內容:
設置 Tomcat 以進行應用程序部署
Tomcat 連接器配置
預設情況下,Tomcat 伺服器在埠 8080 上偵聽請求。要更改此預設埠,您可以修改 <Tomcat_Home>/conf/server.xml。清單 1 顯示了更改預設埠配置所需要的修改。
<Service name="Catalina"> ... ... <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> |
將埠值更改為您喜歡的任何埠。請記住在對 server.xml 做出任何配置更改之前停止伺服器。重新啟動伺服器以使設置生效。
Tomcat 身份驗證領域配置
在 Tomcat 中,領域維護用戶、組和密碼信息。預設情況下,您在 Tomcat 中配置一個 UserDatabaseRealm,從而使您能夠在允許用戶訪問商店之前對他們進行身份驗證。server.xml 文件也設置了此領域。清單 2 中的 server.xml 代碼段中粗體顯示的行表示該身份驗證領域的配置。
<Server port="8005" shutdown="SHUTDOWN"> ... <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> ... <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> ... <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> |
上面的配置將 UserDatabaseRealm 設置為使用 conf/tomcat-users.xml 下面的一個文件來維護用戶、密碼和角色信息。由於該領域是在 <Engine> 級別配置的,因此它對運行在 Tomcat <Engine> 組件實例上的所有主機可用。
要運行我們的應用程序,您不必對 conf/server.xml 文件進行任何修改,因為原樣的預設配置就適合我們的需要。但是,您確實需要對 conf/tomcat-users.xml 文件做出某些更改,其中 UserDatabaseRealm 保存了所有的用戶信息。對 tomcat-users.xml 文件進行清單 3 中以粗體表示的更改。
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="tomcat"/> <role rolename="role1"/> <user username="tomcat" password="tomcat" roles="tomcat,manager,admin"/> <user username="role1" password="tomcat" roles="role1"/> <user username="both" password="tomcat" roles="tomcat,role1"/> </tomcat-users> |
此代碼將 tomcat 用戶(密碼為“tomcat”角色分配為 manager 和 admin 組的成員。
在該應用程序的 web.xml 文件中,商店的控制器受到保護,並且它只對具有“admin”角色的用戶授予訪問許可權。清單 4 中的粗體行顯示了保護應用程序的 web.xml 代碼(在代碼分發包的 dd 目錄中)。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>ShoppingStore</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>GeneralStore</servlet-name> <servlet-class>com.ibm.wasce.store.StoreController</servlet-class> </servlet> <servlet-mapping> <servlet-name>GeneralStore</servlet-name> <url-pattern>/store.cgi</url-pattern> </servlet-mapping> <resource-ref> <description>Derby DB connection</description> <res-ref-name>jdbc/storeDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> <security-constraint> <display-name>General Store Security Constraint</display-name> <web-resource-collection> <web-resource-name>Entire store</web-resource-name> <url-pattern>*.cgi</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>Shopping Realm</realm-name> </login-config> <security-role> <role-name>admin</role-name> </security-role> <servlet> <description></description> <display-name>CheckOut</display-name> <servlet-name>CheckOut</servlet-name> <servlet-class>com.ibm.wasce.store.CheckOut</servlet-class> </servlet> <servlet-mapping> <servlet-name>CheckOut</servlet-name> <url-pattern>/CheckOut</url-pattern> </servlet-mapping> </web-app> |
上面的代碼中的 <security-constraint>和 <security-role> 元素是標準 J2EE 安全配置元素,並且在容器之間是可移植的。因此,未改變的 web.xml 稍後可以在 Community Edition 環境中工作。
設置 Derby 網路伺服器
首先,請確保安裝了 Apache Derby 10.3.1。然後按照以下步驟操作:
java org.apache.derby.drda.NetworkServerControl start |
Derby 伺服器啟動並在預設埠 1527 進行偵聽。
使用 ij 命令執行該 SQL 腳本:
java org.apache.derby.tools.ij createdb1.sql
createdb1.sql 腳本包含清單 5 所示的 SQL 命令。
connect 'jdbc:derby://localhost/generalstore;create=true'; drop table promotion; create table promotion (id char (5) not null, message char(40) not null, primary key(id)); insert into promotion values ('1', 'Thank your for your order.'); insert into promotion values ('2', 'Have a nice day!'); exit; |
如果您看到消息 ERROR 08001: No suitable driver,則所需的 lib/derbyclient.jar 庫不在 CLASSPATH 環境變數中。
設置 Apache ActiveMQ JMS 代理
確保安裝了 apache-activemq-4.1.1,然後執行以下步驟:
設置 Apache Axis
在 CLASSPATH 環境變數中包括以下元素。您可以從 Eclipse 中自動下載下面提到的 JAR。有關更多信息,請參閱“從 Community Edition WAR 文件中刪除不需要的服務”。
Tomcat JNDI 資源引用和 JDBC 連接器
checkoutcart.jsp 頁面使用 JSTL 的 SQL 支持標記訪問促銷資料庫並輸出促銷消息。清單 6 顯示了訪問 RDBMS 的代碼摘錄。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="storetags" uri="/GeneralStoreTagLibrary" %> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> ... <sql:query var="rs" dataSource="jdbc/storeDB"> select * from promotion </sql:query> ... <tr> <td colspan="5"> <c:forEach var="row" items="${rs.rows}"> ${row.message}<br/> </c:forEach> </td> </tr> |
JSTL <sql:query> 標記將通過 JNDI查找名為 jdbc/storeDB 的數據源。該名稱引用是以 J2EE 標準的方式在應用程序的 web.xml 部署描述符中定義的。該標準配置同時適用於 Tomcat 和 Community Edition。清單 7 顯示了該配置。
<resource-ref> <description>Derby DB connection</description> <res-ref-name>jdbc/storeDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> |
您現在需要配置此引用,以便以特定於容器的方式(對於 Tomcat 和 Community Edition 來說是不同的)匹配實際的 JDBC 驅動程序和 RDBMS 連接。對於 Tomcat,您將在 conf/context.xml 文件(可以在 Tomcat 安裝目錄中找到)中進行配置。請參見清單 8:
<Context> ... ... <Resource name="jdbc/storeDB" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" driverClassName="org.apache.derby.jdbc.ClientDriver" user="APP" password="APP" url="jdbc:derby://localhost/generalstore"/> ... ... </Context> |
為 ActiveMQ 代理配置 Tomcat
CheckOut.java Servlet 在下訂單成功時顯示一條消息。清單 9 顯示了該 Servlet 中查找連接工廠和隊列的代碼摘錄:
Context initContext = new InitialContext(); Context jndiContext=(Context) initContext.lookup("java:comp/env"); connectionFactory = (ConnectionFactory) jndiContext.lookup("jms/ConnectionFactory"); queue = (Queue) jndiContext.lookup("jms/aQueue"); |
您將在 web.xml 中定義對連接工廠和隊列的名稱引用,如清單 10 所示。
<resource-ref> <description>jms broker</description> <res-ref-name>jms/ConnectionFactory</res-ref-name> <res-type>javax.jms.ConnectionFactory</res-type> <res-auth>Container</res-auth> </resource-ref> <message-destination-ref> <message-destination-ref-name>jms/aQueue</message-destination-ref-name> <message-destination-type>javax.jms.Queue</message-destination-type> <message-destination-usage>ConsumesProduces</message-destination-usage> <message-destination-link>aQueue</message-destination-link> </message-destination-ref> <message-destination> <message-destination-name>aQueue</message-destination-name> </message-destination> |
您現在需要為 ActiveMQ 連接工廠和目標隊列配置 Tomcat,也是以特定於容器的方式進行配置。對於 Tomcat,您可以在 conf/context.xml 文件(可以在 Tomcat 安裝目錄中找到)中進行配置。清單 11 顯示了連接工廠和目標隊列參數。
<Context> ... ... <Resource name="jms/ConnectionFactory" auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="JMS Connection Factory" factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="tcp://localhost:61616" brokerName="localhost" persistent="false" useEmbeddedBroker="false"/> <Resource name="jms/aQueue" auth="Container" type="org.apache.activemq.command.ActiveMQQueue" factory="org.apache.activemq.jndi.JNDIReferenceFactory" physicalName="MY.TEST.QUEUE"/> ... ... </Context> |
使用 StockService.wsdl 生成 Web 服務類
在本部分中,我們將生成 Web 服務類:
<wsdl:definitions xmlns:http=http://schemas.xmlsoap.org/wsdl/http/ xmlns:soap=http://schemas.xmlsoap.org/wsdl/soap/ xmlns:s=http://www.w3.org/2001/XMLSchema xmlns:soapenc=http://schemas.xmlsoap.org/soap/encoding/ xmlns:tns=http://www.webserviceX.NET/ xmlns:tm=http://microsoft.com/wsdl/mime/textMatching/ xmlns:mime=http://schemas.xmlsoap.org/wsdl/mime/ targetNamespace=http://www.webserviceX.NET/ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://www.webserviceX.NET/"> <s:element name="GetQuote"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="symbol" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="GetQuoteResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="GetQuoteResult" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="string" nillable="true" type="s:string"/> </s:schema> </wsdl:types> <wsdl:message name="GetQuoteSoapIn"> <wsdl:part name="parameters" element="tns:GetQuote"/> </wsdl:message> <wsdl:message name="GetQuoteSoapOut"> <wsdl:part name="parameters" element="tns:GetQuoteResponse"/> </wsdl:message> <wsdl:message name="GetQuoteHttpGetIn"> <wsdl:part name="symbol" type="s:string"/> </wsdl:message> <wsdl:message name="GetQuoteHttpGetOut"> <wsdl:part name="Body" element="tns:string"/> </wsdl:message> <wsdl:message name="GetQuoteHttpPostIn"> <wsdl:part name="symbol" type="s:string"/> </wsdl:message> <wsdl:message name="GetQuoteHttpPostOut"> <wsdl:part name="Body" element="tns:string"/> </wsdl:message> <wsdl:portType name="StockQuoteSoap"> <wsdl:operation name="GetQuote"> <wsdl:input message="tns:GetQuoteSoapIn"/> <wsdl:output message="tns:GetQuoteSoapOut"/> </wsdl:operation> </wsdl:portType> <wsdl:portType name="StockQuoteHttpGet"> <wsdl:operation name="GetQuote"> <wsdl:input message="tns:GetQuoteHttpGetIn"/> <wsdl:output message="tns:GetQuoteHttpGetOut"/> </wsdl:operation> </wsdl:portType> <wsdl:portType name="StockQuoteHttpPost"> <wsdl:operation name="GetQuote"> <wsdl:input message="tns:GetQuoteHttpPostIn"/> <wsdl:output message="tns:GetQuoteHttpPostOut"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="StockQuoteSoap" type="tns:StockQuoteSoap"> <soap:binding transport=http://schemas.xmlsoap.org/soap/http style="document"/> <wsdl:operation name="GetQuote"> <soap:operation soapAction=http://www.webserviceX.NET/GetQuote style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="StockQuoteHttpGet" type="tns:StockQuoteHttpGet"> <http:binding verb="GET"/> <wsdl:operation name="GetQuote"> <http:operation location="/GetQuote"/> <wsdl:input> <http:urlEncoded/> </wsdl:input> <wsdl:output> <mime:mimeXml part="Body"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="StockQuoteHttpPost" type="tns:StockQuoteHttpPost"> <http:binding verb="POST"/> <wsdl:operation name="GetQuote"> <http:operation location="/GetQuote"/> <wsdl:input> <mime:content part="NMTOKEN" type="application/x-www-form-urlencoded"/> </wsdl:input> <wsdl:output> <mime:mimeXml part="Body"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="StockQuote"> <wsdl:port name="StockQuoteSoap" binding="tns:StockQuoteSoap"> <soap:address location="http://www.webservicex.net/stockquote.asmx"/> </wsdl:port> <wsdl:port name="StockQuoteHttpGet" binding="tns:StockQuoteHttpGet"> <http:address location="http://www.webservicex.net/stockquote.asmx"/> </wsdl:port> <wsdl:port name="StockQuoteHttpPost" binding="tns:StockQuoteHttpPost"> <http:address location="http://www.webservicex.net/stockquote.asmx"/> </wsdl:port> </wsdl:service> </wsdl:definitions> |
此步驟還將下載在“設置 Apache Axis”部分中提到的 JAR,並將 jar 移動到應用程序的 WEB-INF/lib 文件。
清單 13. 訪問 IBM 股票報價的代碼片段
<% StockQuoteLocator sql = new StockQuoteLocator(); StockQuoteSoap sqs = sql.getStockQuoteSoap(); PrintWriter out1 =response.getWriter(); String s1=sqs.getQuote("IBM"); s1=s1.substring(46,51); %> |
在我們的例子中,我們將 IBM 作為變數進行傳遞,該變數將從 Stock Web 服務檢索 IBM 股票報價。
在 Tomcat 中部署應用程序
在本部分中,我們將在 Tomcat 中部署應用程序,並使用以下步驟:
將應用程序遷移到 Community Edition
一般情況下,要將 General Store 應用程序遷移到 Community Edition 1.0,您需要執行以下操作:
遷移過程中不需要更改的元素有:
對於這些元素,要小心進行編碼,以使其在 J2EE 容器之間可以移植。
在 Community Edition 中更改 Tomcat 連接器使用的埠
如果您需要在 Community Edition 中更改 Tomcat 連接器使用的埠,不要查找 server.xml 文件;Community Edition 中沒有這個文件。取而代之,要在 Community Edition 安裝目錄下的 var/config 目錄中查找 config-substitutions.properties 文件。清單 14 顯示了 Community Edition 中的埠配置:
AJPPort=8009 clusterNodeName=NODE ORBPort=6882 MaxThreadPoolSize=500 ResourceBindingsNamePattern= SMTPHost=localhost ResourceBindingsQuery=?\#org.apache.geronimo.naming.ResourceSource COSNamingPort=1050 webcontainer=TomcatWebContainer OpenEJBPort=4201 ORBSSLPort=2001 PortOffset=0 ActiveMQStompPort=61613 JMXPort=9999 ORBHost=localhost EndPointURI=http\://localhost\:8080 NamingPort=1099 DefaultWadiSweepInterval=36000 WebConnectorConTimeout=20000 HTTPSPort=8443 COSNamingHost=localhost MinThreadPoolSize=200 ReplicaCount=2 ServerHostname=0.0.0.0 ActiveMQPort=61616 ORBSSLHost=localhost SMTPPort=25 webcontainerName=tomcat6 ResourceBindingsNameInNamespace=jca\: DefaultWadiNumPartitions=24 HTTPPort=8080 clusterName=CLUSTER_NAME ClusterName=DEFAULT_CLUSTER ResourceBindingsFormat={groupId}/{artifactId}/{j2eeType}/{name} RemoteDeployHostname=localhost TmId=71,84,77,73,68 |
您可以在 Community Edition 中修改清單 14 中的代碼,以更改預設埠配置。您還可以取消註釋 PortOffset 變數,並輸入自己選擇的值。此更改將通過所定義的 PortOffset 值修改 Community Edition 中的所有服務的埠設置。例如,如果您定義了 PortOffset=10,則 HTTP 埠將為 8090,管理控制台的 URL 將為 http://localhost:8090/console 。
記住使用以下命令關閉 Tomcat 應用程序使用的獨立 Derby 資料庫:
java org.apache.derby.drda.NetworkServerControl stop
另外,您也可以使用 Web 控制台添加 Tomcat 連接器,或者編輯連接器使用的埠號。只需在 Web 控制台菜單中選擇 Server - Web Server 。在編輯並保存埠號更改之後,重新啟動以使埠更改立即生效。記住,如果您在使用該埠號顯示管理控制台,請更改瀏覽器 URL 中的埠號以重新顯示控制台。
配置 Community Edition 管理的身份驗證領域
預設情況下,Community Edition 管理一個名為 geronimo-admin 的領域,該領域使用 var/security 目錄下的屬性文件存儲用戶、密碼和組信息。該領域中配置的唯一用戶是 system,其密碼為 manager,並屬於 admin 組和角色。通過使用 Web 控制台菜單中的 Security - Console Realm 選項,您可以向預設領域添加用戶和組。
您可以在特定於 Community Edition 的部署計劃 geronimo-web.xml 中配置該安全領域。您需要在 geronimo-web.xml 中添加清單 15 中的代碼:
<security-realm-name>geronimo-admin</security-realm-name> <sec:security> <sec:default-principal realm-name="geronimo-properties-realm"> <sec:principalclass="org.apache.geronimo. security.realm.providers.GeronimoUserPrincipal" name="system"/> </sec:default-principal> <sec:role-mappings> <sec:role role-name="admin"> <sec:realm realm-name="geronimo-admin"> <sec:principalclass="org.apache.geronimo. security.realm.providers.GeronimoGroupPrincipal" name="admin"/> <sec:principalclass="org.apache.geronimo. security.realm.providers.GeronimoUserPrincipal" name="system"/> </sec:realm> </sec:role> </sec:role-mappings</sec:security> |
在 Community Edition 中創建 Promotion 資料庫表
使用一個基於 GUI 的 Web 控制台,您可以容易地在 Community Edition 中創建 Promotion 表:
create table promotion (id char (5) not null, message char(40) not null, primary key(id)); insert into promotion values ('1', 'Thank your for your order.'); insert into promotion values ('2', 'Have a nice day!'); |
在 Community Edition 中創建 Derby 數據源
<sys:dependency> <sys:groupId>console.dbpool</sys:groupId> <sys:artifactId>SampleDS</sys:artifactId> </sys:dependency> <naming:resource-ref> <naming:ref-name>jdbc/storeDB</naming:ref-name> <naming:resource-link>SampleDS</naming:resource-link> </naming:resource-ref> |
創建 ActiveMQ JMS 連接工廠和隊列
您可以使用 GUI Web 控制台容易地創建 Community Edition 管理的連接工廠和隊列:
<sys:dependency> <sys:groupId>org.apache.geronimo.configs</sys:groupId> <sys:artifactId>activemq-ra</sys:artifactId> <sys:version>2.1.1</sys:version> <sys:type>car</sys:type> </sys:dependency> ... ... <naming:resource-ref> <naming:ref-name>jms/ConnectionFactory</naming:ref-name> <naming:pattern> <naming:groupId>org.apache.geronimo.configs</naming:groupId> <naming:artifactId>activemq-ra</naming:artifactId> <naming:version>2.1.1</naming:version> <naming:name>DefaultActiveMQConnectionFactory</naming:name> </naming:pattern> </naming:resource-ref> <naming:message-destination> <naming:message-destination-name> aQueue </naming:message-destination-name> <naming:admin-object-link> SendReceiveQueue </naming:admin-object-link> </naming:message-destination> |
從 Community Edition WAR 文件中刪除不需要的服務
如果將示例 ShoppingStore_Tomcat.war 文件的大小(大約 9MB)與 ShoppingStore_CommunityEdition.war 文件的大小(大約 32KB)做一下比較,您可能疑惑為什麼存在如此巨大的大小差異。原因在於,您需要在 Tomcat 安裝的應用程序 WEB-INF\lib 目錄中包括的所有服務(Axis、JMS、公共服務等)和 Derby 資料庫驅動程序已經集成到 Community Edition 中。刪除這些 jar 文件的優點在於,您不必集成和支持它們。
以下 ShoppingStore_Tomcat.war jar 文件包括在 WEB-INF\lib 中:
這些 jar 文件也包括在 Community Edition 的 <WASCE_HOME>/repository 目錄中。要確定 JAR 是否存在,可以在 /repository 目錄中搜索不帶版本(例如,activeio-core)或不帶來源(例如,activemq)的組件名稱。/repository 中的對應 jar 文件將包含版本(例如,axis1-4.jar)。未在 /repository 中列出的 JAR 文件(例如特定於應用程序的文件)將需要在 WEB-INF\l ib 中進行維護。
在此遷移示例中,Tomcat WEB-INF\lib 目錄中的所有 JAR 文件都可以刪除。大多數 Web 應用程序在 WEB-INF\lib 目錄中放置某些特定於應用程序的 JAR 文件,因此減小庫的能力視情況而異。資料庫驅動程序 JAR 文件一般應該安裝在 \repository 中並與應用程序共享。管理控制台工具將幫助下載和安裝 \repository 中不可用的資料庫驅動程序文件(即 Oracle 或 MySQL)(選擇 Services - Database Pools - Using the Geronimo database pool wizard)。
此外,web.xml 文件中可能存在某些 <servlet> 參數,這些參數指向 WEB-INF\lib 目錄中的 JAR 文件。您需要確定刪除某個 JAR 文件是否需要對 web.xml 做出更改。
在 Community Edition 中部署應用程序
要部署應用程序,可以啟動管理控制台並按照以下步驟操作:
遷移問題故障排除
本文中的示例應用程序提供了用於典型 Tomcat 遷移的配置和部署計劃示例。作為部署例子,示例中包括了許多不同的資源類型。管理控制台中的 Deploy New 菜單提供了無法部署的 WAR 文件的詳細錯誤消息。
如果 WAR 文件無法部署,腳本部署工具也提供了錯誤信息。如果錯誤發生在應用程序測試過程中,請檢查 Eclipse 伺服器日誌或 var\log\server.log 文件(在 Linux 中為 geronimo.out 文件),查找其中可能在訪問應用程序時發生的 Java 錯誤。
一些常見的遷移問題包括:
我們將在下面幾個部分中詳細研究這些問題。
類載入器問題
預設情況下,Community Edition 遵循首先從父配置(即從 \repository)中載入類的類載入器層次結構。Tomcat 首先從應用程序載入類。如果 Tomcat 應用程序使用較舊的組件(例如較舊版本的 Axis),而 API 結構已更改,可能就會出現問題。在此情況下,當您部署 WAR 時或在運行時,類載入器錯誤可能就會出現。
糾正類載入器問題的一種方法是向部署計劃中的 <moduleId> 參數後面添加 hidden-classes 參數。hidden-classes 參數標識不應該從父配置載入類的名稱。清單 19 顯示了針對某個 Axis 類載入器問題的 geronimo-web.xml 示例。應用程序將使用 WEB-INF\lib 中的 axis.jar 文件:
</moduleId> <hidden-classes> <filter>org.apache.axis2<filter> </hidden-classes> |
另一種糾正類載入器問題的方法是將 inverse-classloading 參數添加到部署計劃中的 <moduleId> 參數後面。逆向類載入致使 Community Edition 遵循在載入應用程序 WEB-INF\lib 類之後立即從父配置中載入類的類載入器層次結構。下面包括的清單 20 顯示了用於逆向類載入器的 geronimo-web.xml 示例:
</moduleId> <inverse-classloading/> |
修改類載入器結構應該使應用程序能夠成功遷移。然而,您應該在某個時候糾正應用程序代碼以使用 Community Edition 中的組件,因為組件集成和支持是使用 Community Edition 而不使用 Tomcat 的主要優點。有關更多信息,請訪問文檔中的管理類路徑。
資源配置問題
諸如資料庫和安全連接等資源可能導致部署和運行時問題。由於 Tomcat 具有不同的配置結構,並且使用 server.xml 和 context.xml,因此在遷移到 Community Edition 時可能會出現配置問題。在某些情況下,問題是參數不正確或訪問問題。對於資料庫,嘗試在管理控制台中使用 Database Pools - Geronimo database pool wizard 來測試資料庫連接。當您“部署”資料庫時,該嚮導將對照資料庫進行測試,如果連接不成功,則會出現錯誤。您可以編輯池以更改參數,然後重新測試,直到連接成功為止。對於安全領域,嘗試在管理控制台中使用 Security Realms - Add new security realm 菜單來測試安全領域連接。Security Realm 嚮導中有一個菜單允許您輸入登錄用戶名和密碼以測試連接。如果登錄成功,您可以編輯安全領域並重新測試,直到安全領域連接成功為止。
部署計劃問題
geronimo-web.xml 部署計劃需要特定的參數和格式才能正確工作。本文中使用的 General Store 應用程序在 ShoppinStore_WASCE.war 文件中包括了有效的 geronimo-web-xml 文件。可以從 Community Edition 下載站點獲得示例應用程序包。這些示例包括各種帶 geronimo-web.xml 部署計劃的應用程序類型。您可以使用這些示例作為您自己的部署計劃需求的基礎。
此外,嘗試使用管理控制台中的 Plan Creator 菜單,在由管理控制台創建的 Tomcat WAR 文件和資源連接(即資料庫、JMS、安全連接)的基礎上,創建 geronimo-web.xml 部署計劃。此選項提供了一種創建 geronimo-web.xml 部署計劃的簡單方法。在部署 WAR 文件時,您可以通過使用 Plan 欄位在 WAR 文件之外定義部署計劃。有關部署 WAR 文件和外部部署計劃的信息,請參見圖 21。
結束語
將應用程序從 Tomcat 6.0.x 遷移到 Community Edition V2.1 是相當簡單的,因為 Tomcat 6.0.x 已完好無損地進行了集成,並且實際上是 Community Edition 的一部分。然而,由於 Community Edition 現在控制所有的配置管理,因此在 Tomcat 上通常位於 server.xml 或 context.xml 中的配置元素現在已遷移到:
通過將 Web 應用程序從 Tomcat 6.x 逐步遷移到 WebSphere Application Server Community Edition,我們看到了該遷移的要點包括:身份驗證領域切換;JNDI 引用映射;設置 Derby 資料庫;配置 JDBC 連接器、JMS 資源工廠和 JMS 隊列。(責任編輯:A6)
[火星人 ] 從 Apache Tomcat Version 6.0.x 遷移到 WebSphere Application Server Community Edition已經有1118次圍觀