以下对Websphere部署步骤及问题处理进行了详细说明,包括SSL密钥库生成、HTTPS配置、解决同一个was服务中部署多个应用时session冲突问题、Websphere参数优化、session持久化、web.xml更新问题、在Websphere控制台中查看运行状态等。
was:WebSphere Application Server
ihs:IBM HTTP Server
服务:was中的Server
应用:was服务中部署的应用
单元:was中的Cell
节点:was中的Node
服务端口:was的server监听的端口
虚拟主机:was的应用可访问的端口,必须存在相同端口号的服务端口才能访问
上下文根:was的应用访问URL的最后一部分(不包含参数),如http://ip:port/context?arg中的/context
nd版was:Network Deploy,可使用was的软集群,不同服务器之间可实现会话复制。was控制台的进程与was Server的进程独立。一个Node可以安装多个Server。除了was Server的进程外,还包括node与dmgr的进程。
base版was:不可使用was的软集群,不同服务器之间不可实现会话复制。was控制台的进程与was Server的进程为同一个进程。一个Node只能安装一个Server。除了was Server的进程外,不包括node与dmgr的进程。
以下步骤在was base版本8.5测试,不同版本的was可能存在差异。修改了was的配置后,通常需要重启was Server才能生效。
以下步骤中各项配置的值仅起说明使用,请以实际需要的值为准。
若应用使用HTTPS访问,需要先生成SSL密钥库,在应用所在的每台服务器执行以下操作(不同服务器使用相同命令生成的密钥库文件与密钥请求文件均不相同,因此需要在每台服务器均执行):
a. 使用was用户,进入was的java/bin目录,/was/IBM/WebSphere/AppServer/java/bin
b. 执行以下命令,在当前目录生成密钥库文件
参数 |
说明 |
-keystore |
指定生成的keystore文件 |
-alias |
密钥别名,固定为server(下同) |
-storepass与-keypass |
密码,需修改 |
-dname,CN= |
使用HTTPS访问的域名(若使用IP访问则应为IP) |
-validity |
有效天数,7300约20年 |
命令如下:
keystore=keystore.jks alias=server pwd=xxxxxx url=cscsr.szrcb.net validity=7300
./keytool -genkey -alias $alias -keyalg RSA -keysize 2048 -keystore $keystore -storetype jks -storepass $pwd -keypass $pwd -dname "CN=$url, OU=srcb, O=srcb, L=sz, ST=gd, C=CN" -validity $validity |
若执行成功,无提示;若提示“keytool 错误:java.lang.Exception: 未生成密钥对,别名
c. 执行以下命令,在当前目录生成证书请求文件certreq-xx.pem,xx为当前服务器的IP尾号,用于区分不同服务器生成的密钥请求文件
pem=certreq-xx.pem alias=server pwd=xxxxxx
./keytool -certreq -alias $alias -sigalg MD5withRSA -file $pem -keystore keystore.jks -keypass $pwd -storepass $pwd |
若执行成功,无提示
d. 将生成的certreq-xx.pem发送给CA,生成每台服务器的证书,需要告知CA生成keystore文件时使用的域名
e. 将CA提供的每台服务器的证书文件xx.cer分别上传至对应服务器的/was/IBM/WebSphere/AppServer/java/bin目录,将CA的根证书也上传至该目录
f. 执行以下命令,将CA根证书root.cer导入密钥库,会提示“信任此证书吗?[no]:”,输入“y”并回车
keystore=keystore.jks rootcer=root.cer pwd=xxxxxx
./keytool -import -alias intermediate -keystore $keystore -trustcacerts -storepass $pwd -file $rootcer |
若执行成功,提示“证书已添加到密钥库中”
g. 执行以下命令,将CA生成的服务器证书xx.cer导入密钥钥库,
keystore=keystore.jks alias=server pwd=xxxxxx cert=xx.cer
./keytool -import -alias $alias -keystore $keystore -trustcacerts -storepass $pwd -file $cert |
若执行成功,提示“证书应答已安装在密钥库中”
提示“keytool 错误:java.lang.Exception: 应答中的公用密钥与密钥库中的公用密钥不匹配”,说明CA提供的证书有问题
h. 将keystore.jks复制到保存密钥的目录,如/was/key
i. 执行以下命令,导出服务器证书(导出的证书与CA提供的相同,可不执行)
keystore=keystore.jks alias=server pwd=xxxxxx exportcert=xx.cer
./keytool -export -alias $alias -keystore $keystore -file $exportcert -storepass $pwd |
若导出成功,提示“证书存储在文件
该步骤仅需在每台服务器执行一次。
将ojdbc6.jar上传至${WAS_INSTALL_ROOT}/lib目录下。
WAS_LIBS_DIR与WAS_INSTALL_ROOT定义在“环境->WebSphere 变量”中。
WAS_INSTALL_ROOT在Linux下一般为/was/IBM/WebSphere/AppServer,Windows下一般为D:\IBM\WebSphere\AppServer。
说明:
oracle 11g,JDK 1.6,需要使用驱动ojdbc6.jar,驱动程序与oracle及JDK版本的对应关系可在oracle官网查看。ojdbc6.jar可从测试环境oracle服务器获取,所在目录如“/soft/product/11.2.0.3/dbh/jdbc/lib”。
该步骤仅需在每个Node执行一次。
a. 新建JDBC提供程序,作用域选择单元
b. 设置JDBC提供程序基本信息
c. 设置JDBC驱动程序文件的类路径,“类路径”此时不需修改,将“另存为WebSphere变量xxx的目录位置”修改为“${WAS_INSTALL_ROOT}/lib”。
d. 完成
e. 保存
f. 点击刚生成好的JDBC提供程序“Oracle JDBC Driver”
g. 修改类路径为“${WAS_INSTALL_ROOT}/lib/ojdbc6.jar”,保存。ojdbc6.jar驱动可用于10g与11g的oracle数据库。
该步骤仅需为每个数据库执行一次。
a. 打开“J2C认证数据”
b. 新建
c. 设置“别名”等信息,“用户标识”为数据库用户名,密码为数据库密码,保存
建议填写描述,否则启动时日志会提示“找不到 ConnectionFactory 或 DataSource [数据源名字] 的 mappingConfigAlias。”。
a. 新建数据源,作用域选择单元
b. 设置数据源信息
c. 选择之前创建的JDBC提供程序
d. 设置数据源URL(域名需要在hosts文件中设置)
e. 选择对应的J2C认证信息,完成,保存
a. 新建虚拟主机
b. 设置虚拟主机名字,保存
c. 点击刚创建的虚拟主机
d. 点击“主机别名”,新建
e. 设置需要的端口
a. 选择需要设置的服务
b. 点击“端口”,新建
c. 设置端口属性。“指定端口名”为当前新建的端口名字,“主机”为*,不能使用localhost,否则无法访问。“端口”应与对应虚拟主机设置的端口相同。确定,保存。新增或修改端口后,需要重启was的server才能生效。
a. 选择需要设置的服务
b. 点击“Web容器传输链”,新建
c. 输入传输链名称,传输链模板选择“WebContainer”(HTTP)
d. 选择刚创建的端口,完成,保存
a. 将“SSL密钥库生成”步骤生成的keystore.jks文件从/was/IBM/WebSphere/AppServer/java/bin移动到/was/key目录中
b. 进入SSL的密钥库和证书配置界面
c. 选择“SSL密钥库”,新建
d. 输入密钥库的名称,“路径”填入jks文件的路径,输入jks文件密码,类型选择“JKS”
e. 进入SSL配置界面
f. 新建SSL配置
g. 输入SSL配置名称,“信任库名称”与“密钥库名称”选择上一步骤新建的密钥库,点击“获取证书别名”,“缺省服务器证书别名”与“缺省客户机证书别名”全自动变成密钥库的别名(即创建密钥库时-alias的参数值)
h. 更新证书文件后,若未修改密码,重启was服务即可生效,不需重新进行配置
与配置HTTP的传输链相比,有以下区别:
a. 输入传输链名称,传输链模板选择“WebContainer-Secure”(HTTPS)
b. 保存之后,点击刚配置了传输链,点击“SSL入站通道(SSL_X)”
c. “特定于此端点”选择上一步骤新建的SSL配置。
完成以上配置后,需在客户端安装SSL根证书,重启was服务,可使用HTTPS链接登录。
cd 到需要打包的目录,即“WEB-INF”目录所在的目录,执行以下命令打包
jar -vcf xxx.war * |
将生成的war包上传到服务器指定目录,如/was/publish
a. 安装应用
b. 选择需要部署的war包
c. 选择“快速路径”
d. 设置“安装应用程序的目录”
e. 将模块映射至服务器
f. 选择需要的JNDI名称
g. 选择需要的虚拟主机
h. 设置上下文根,完成,保存
使用“更新”功能即可使用新的war包部署应用,不需要先卸载再重新安装
若同一个was服务中若部署了多个应用,由于应用的默认session名字均为JSESSIONID,当使用浏览器登录同一was服务(使用相同的IP或域名)的不同应用时,可能产生session冲突的问题,导致服务器无法正确判断浏览器的登录状态。可通过网络层面与应用层面解决。
为同一个was服务的不同应用申请不同的域名,每个应用使用不同的域名访问,session不会出现冲突,可解决上述问题。
新呼叫中心采用该方法解决上述问题。
为同一个was服务的不同应用设置不同的session名字,可解决上述问题,步骤如下:
a. 打开“WebSphere企业应用程序”,打开需要设置的应用
b. 打开“会话管理”
c. 钩选“覆盖会话管理”,打开“启用cookie”
d. 修改“cookie名”,如使用应用简称作为前缀或后缀,使其不与同一个was服务中的其他应用的冲突。完成以上修改后,不需重启was服务即可生效。
默认配置下,访问was控制台或was部署的应用时,返回的HTTP头中会包含Server字段,内容为“WebSphere Application Server/[was版本号]”,如“Server: WebSphere Application Server/8.0”。
若需要修改或移除上述Server字段,需要在was应用所使用的Web容器传输链的HTTP入站通道新增定制属性,如下图所示(假设was应用所使用的Web容器传输链名称为“csr_chain”)。
当需要移除上述Server字段时,需要添加的属性名称为“RemoveServerHeader”,值为“true”。
当需要修改上述Server字段时,需要添加的属性名称为“ServerHeaderValue”,值为所需返回的HTTP头中的Server字段值。如将值设为“xxx”,返回的Server字段内容为“Server: xxx”。
修改访问was时返回的HTTP头中的Server字段,可判断浏览器当前访问的服务器,便于定位会话丢失与会话保持问题。
a. 选择需要设置的服务
b. 打开“Java和进程管理”“进程定义”
c. 打开“其他属性”“Java虚拟机”
d. 设置“初始堆大小”与“最大堆大小”,点击“确定”“保存”
a. 选择需要设置的服务
b. 打开“其他属性”“线程池”
c. 打开“WebContainer”
d. 设置最小与最大线程数,点击“确定”“保存”
a. 打开“资源”“JDBC”“数据源”
b. 打开需要修改的数据源
c. 打开“其他属性”“连接池属性”
d. 修改最大与最小连接数,点击“确定”“保存”
a. 进入服务的日志设置界面
b. 打开“JVM日志”界面
c. System.out与System.err均设为最大大小:20MB,历史日志文件最大数:10
a. 打开需要配置session持久化的应用的会话管理界面
b. 钩选“覆盖会话管理”以及“启用cookie”并保存,否则会使用对应的Server的会话管理设置,session持久化设置不会生效。再点击“分布式环境设置”。
c. 点击“数据库”;
d. 在“数据源JNDI名称”处写入was应用所使用的数据源JNDI名称,在“用户标识”处写入对应数据库用户名,在“密码”处写入对应数据库用户的密码,“DB2行大小”选择“ROW_SIZE_4KB”,“表空间名”处写入用于保存 session的数据库表对应的表空间,“使用多行模式”需钩选,使session信息在数据库中按多行保存。
e. 打开对应的was Server配置;
f. 点击“Web容器设置”,“Web容器”;
g. 点击“定制属性”;
h. 点击“新建”,创建名称为“UseOracleBLOB”,值为“true”的属性。
若不设置UseOracleBLOB属性,当session中有值超过2000字节时(保存session的表中的SMALL字段长度为2000),System.out日志中会出现以下报错
[15-5-3 14:43:16:792 CST] 0000006f WASSession E DatabaseHashMapMR handlePropertyHits SESN0057E: 将应用程序数据更改存储到数据库时出错。 [15-5-3 14:43:16:793 CST] 0000006f WASSessionCor E DatabaseHashMapMR handlePropertyHits 异常为: java.sql.SQLException: ORA-01460: 转换请求无法实施或不合理
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289) at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:590) at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1973) at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1119) at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2191) at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:2064) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2989) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:658) at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.pmiExecuteUpdate(WSJdbcPreparedStatement.java:1185) at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeUpdate(WSJdbcPreparedStatement.java:802) at com.ibm.ws.session.store.db.DatabaseHashMapMR.handlePropertyHits(DatabaseHashMapMR.java:262) at com.ibm.ws.session.store.db.DatabaseHashMap.persistSession(DatabaseHashMap.java:2123) at com.ibm.ws.session.store.common.BackedHashMap.updateSession(BackedHashMap.java:469) at com.ibm.ws.session.store.common.BackedHashMap.put(BackedHashMap.java:543) at com.ibm.ws.session.store.common.BackedSession.flush(BackedSession.java:240) at com.ibm.ws.session.store.common.BackedSession.flush(BackedSession.java:225) at com.ibm.ws.session.store.common.BackedHashMap.doTimeBasedWrites(BackedHashMap.java:992) at com.ibm.ws.session.store.common.BackedStore.runTimeBasedWrites(BackedStore.java:125) at com.ibm.ws.session.WsTBWSessionStorer.alarm(WsTBWSessionStorer.java:118) at com.ibm.ejs.util.am._Alarm.run(_Alarm.java:133) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1783) |
IBM提供的数据库脚本如下:
CREATE TABLE SESSIONS ( ID VARCHAR(128) NOT NULL , PROPID VARCHAR(128) NOT NULL , APPNAME VARCHAR(128) NOT NULL, LISTENERCNT SMALLINT , LASTACCESS INTEGER, CREATIONTIME INTEGER, MAXINACTIVETIME INTEGER , USERNAME VARCHAR(256) , SMALL RAW(2000), MEDIUM BLOB, LARGE RAW(1) ) |
was会自己执行添加索引的语句,将表空间修改为实际表空间后(以cc_session为例),实际建表语句如下:
DROP TABLE sessions CASCADE CONSTRAINTS;
CREATE TABLE sessions ( ID VARCHAR2(128 CHAR) NOT NULL, propid VARCHAR2(128 CHAR) NOT NULL, appname VARCHAR2(128 CHAR) NOT NULL, listenercnt INTEGER, lastaccess INTEGER, creationtime INTEGER, maxinactivetime INTEGER, username VARCHAR2(256 CHAR), small RAW(2000), medium BLOB, LARGE RAW(1) ) TABLESPACE cc_session PCTUSED 0 PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64 k NEXT 1 m MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT ) LOGGING NOCOMPRESS LOB (medium) STORE AS ( TABLESPACE cc_session ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 0 NOCACHE STORAGE ( INITIAL 64 k NEXT 1 m MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT ) ) NOCACHE NOPARALLEL MONITORING;
CREATE UNIQUE INDEX sess_index ON sessions (ID, propid, appname) LOGGING TABLESPACE cc_session PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 64 k NEXT 1 m MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT ) NOPARALLEL; |
下文中的AppSrv01应为对应服务的实际名称。
应用中通过System.out,System.err输入的日志以及was服务启停日志的存储目录:
/was/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1 |
/was/IBM/WebSphere/AppServer/profiles/AppSrv01/temp/[was的节点名字]/[was的服务名字]/[应用名字]/[应用war包名字] |
was应用部署时,WEB-INF目录会被拷贝生成一个目录。更新应用的WEB-INF目录下的文件时,需将以下目录中的文件同时修改,因此应尽量将WEB-INF目录的文件移动到WEB-INF的子目录中去,方便后期维护。拷贝生成的目录路径如下:
/was/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/[was单元名字]/applications/[应用ear名字]/deployments/[应用war包名字]/[应用名字]/WEB-INF/ |
当使用增量更新方式更新web.xml文件时,应用部署目录的WEB-INF目录以及应用的WEB-INF目录被拷贝的目录中的web.xml文件都需要替换。
当应用读取web.xml时,从应用的WEB-INF被拷贝的目录(见上文)中读取web.xml,而不是从应用部署目录的WEB-INF目录中读取web.xml。
a. web.xml的web-app节点的version值为2.4(或2.3)时
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"> |
当web.xml的web-app节点的version值为2.4时,即文件头如上文所示时,应用部署目录的WEB-INF目录以及应用的WEB-INF目录被拷贝的目录中会出现ibm-datasource-ext.xml、ibm-web-bnd.xmi、ibm-web-ext.xmi、web.xml。
若在web.xml文件中使用
在was控制台查看应用的部署描述符,如下图所示:
b. web.xml的web-app节点的version值为2.5时
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> |
当web.xml的web-app节点的version值为2.5时,即文件头如上文所示时,应用部署目录的WEB-INF目录以及应用的WEB-INF目录被拷贝的目录中会出现ibm-datasource-ext.xml、ibm-metadata.xml、ibm-web-bnd.xml、ibm-web-ext.xml、web.xml、web_merged.xml。
web.xml与web_merged.xml内容类似,经验证,应用会读取web.xml而不是web_merged.xml。
若在web.xml文件中使用
无论web.xml的web-app节点的version值为2.3、2.4或2.5,应用安装后,应用部署目录的WEB-INF目录以及应用的WEB-INF目录被拷贝的目录中的web.xml文件的web-app节点均会被修改为“web-app id="WebApp_xxx"”的形式。若通过替换web.xml文件进行更新时,将“web-app id="WebApp_xxx"”的形式中的 id="WebApp_xxx"删除,不影响应用运行。
在was控制台查看应用的部署描述符,如下图所示:
c. 结论
web.xml的web-app节点的version值应设置为2.5,而不是2.3或2.4,否则使用增量更新方式时,更新了web.xml会导致数据源对应关系丢失。
应用读取web.xml时,若存在web_merged.xml,会从应用的WEB-INF被拷贝的目录(见上文)中读取web_merged.xml的内容;若不存在web_merged.xml,会读取web.xml的内容。
需先启动监视(查看完后停止监视),打开页面后,在左侧选择需要查看的信息,可查看线程池、JDBC连接池、页面访问情况等,点击“查看模块”后会在右侧显示
查看was的session情况的链接为:http://[was服务器IP]:9080/servlet/com.ibm.ws.webcontainer.httpsession.IBMTrackerDebug
必须安装并启动DefaultApplication.ear应用,若被卸载,可使用服务器中的安装文件“/was/IBM/WebSphere/AppServer/installableApps/DefaultApplication.ear”再次安装。
示例如下:
在was控制台点击“故障诊断”“Java转储和核心”
点击“堆转储”,会产生文件heapdump;点击“Java核心”,会产生javacore文件;点击“系统转储”,会产生core文件。
以上文件生成目录一般为:/was/IBM/WebSphere/AppServer/profiles/AppSrv01,AppSrv01与was Server有关。以上文件可使用jca工具(IBM Thread and Monitor dump analyzer for Java)进行分析。
“替换整个应用程序”:将整个应用进行更新。
“替换或添加单个模块”:不详。
“替换或添加单个文件”:替换单个文件,当用于替换web.xml文件时,会将应用部署目录与WAS拷贝的WEB-INF目录中的web.xml文件全部替换,但不会像重新部署时修改web.xml的内容。
“替换、添加或删除多个文件”:说明同上。
nd版was在启动was服务前需要先启动dmgr与node。
服务 |
原始启动脚本 |
原始停止脚本 |
查看进程 |
dmgr |
/was/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh |
同目录stopManager.sh |
ps -ef|grep dmgr |
node |
/was/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/startNode.sh |
同目录stopNode.sh |
ps -ef|grep nodeagent |
https://was服务器IP:9043/ibm/help/index.jsp |
IBM Knowledge Center
将IE选项的[语言]设置中,将中文设为首位,如下图。
若URL中包含了中文,需在java中调用URLEncoder.encode(xxx,"utf-8");,或在js中调用encodeURI(xxx),对URL进行编码,否则中文会乱码。
在jsp或Servlet中处理进行了编码的URL时,需调用URLDecoder.decode(request.getParameter("xxx"), "utf-8");对进行了编码的参数进行解码。使用was部署时,在调用request.getParameter()之前需要先调用request.setCharacterEncoding("UTF-8");,否则获取到的中文会乱码。
在以弹出下载框形式返回待下载文件内容时,需对attachment;filename字段调用URLEncoder.encode(xxx,"utf-8");否则浏览器显示的下载框中文件名会乱码。
报错如下:
[15-1-27 13:37:29:197 CST] 00000111 servlet E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0068E: 应用程序 [csr_war] 中 servlet [action] 的其中一个服务方法抛出异常。创建的异常:[java.lang.IllegalStateException: SRVE0199E: 已获取了 OutputStream at com.ibm.ws.webcontainer.srt.SRTServletResponse.getWriter(SRTServletResponse.java:780) at com.sunyard.struts.RequestProcessor.process(RequestProcessor.java:91) at com.sunyard.struts.ActionServlet.process(ActionServlet.java:76) at com.sunyard.struts.ActionServlet.doGet(ActionServlet.java:81) |
Servlet1.2规定OutputStream只能获取一次,was8.5遵守此规定,tomcat未遵守此规定,因此代码中一次HTTP通信过程中,OutputStream不能获取多于一次。
通过servlet请求下载附件时,必须通过以下代码指定下载类型与文件名,否则可以打开下载提示框,但点击保存会失败。需增加下代码:
response.setHeader("Content-Disposition","attachment; filename=\"" + outFilename + "\""); response.setContentType("application/x-msdownload"); |
使用HTTPS访问时,还需调用以下代码。若不调用以下代码,IE会提示无法下载,使用chrome可以下载,与IE的特性有关。
response.setHeader("Pragma","public"); response.setHeader("Cache-Control","max-age=30"); |
WEB-INF目录中的文件最好只保存一个web.xml文件,其他配置文件均需保存在WEB-INF目录的子目录中。
使用Websphere部署应用时,WEB-INF目录中的文件会在应用部署目录之外的其他目录产生拷贝,在替换文件进行版本时,需要将两个目录中的文件都进行替换,不便于版本更新,因此WEB-INF目录中的文件最好只保存一个web.xml文件。
web.xml文件中最好只保存不会修改的应用配置,若有应用配置可能需要经常修改,最好不要保存在web.xml文件中,而是保存在WEB-INF子目录中的其他配置文件内。
web.xml文件中的web-app节点的version值应为2.5,即web.xml文件的文件头应如下:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> |
web.xml文件中的web-app节点的version值不应为2.4,即web.xml文件的文件头不应如下:
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"> |
若不按照以上配置,可能会导致web.xml文件无法进行增量更新。具体原因见本文“5.4.2 web.xml的web-app节点的version值的影响”。