V1.1 By tdy218
作此文档目的:
方便WLS系统管理员在自定义的启动脚本中使用MEM_ARGS等变量,从而简化工作,易于管理。
理解此文档需要对WLS的启动过程(主要是脚本调用关系)较为熟练。
下面以MEM_ARGS参数的设置为例,进行阐述。
旧有的WLS启动脚本及设置MEM_ARGS参数一例(WLS 8.1):
start_AS.sh
#!/bin/sh
#export
MEM_ARGS=”-Xms768m –Xmx1024m -XX:PermSize=128m-XX:MaxPermSize=256m”
nohupsh startWebLogic.sh >> "${AdminServer_Name}.out@${suffix}"2>&1 &
startWebLogic.sh
………………………………
.${WL_HOME}/common/bin/commEnv.sh(WLS 9++
为
.${DOMAIN_HOME}/bin/setDomainEnv.sh $*)
export
MEM_ARGS=”-Xms768m –Xmx1024m -XX:PermSize=128m-XX:MaxPermSize=256m”
${JAVA_HOME}/bin/java${JAVA_VM} ${MEM_ARGS} ${JAVA_OPTIONS} -Dweblogic.Name=${SERVER_NAME}-Djava.security.policy=${WL_HOME}/server/lib/weblogic.policy weblogic.Server
………………………………
在start_AS.sh中设置的MEM_ARGS等变量无法生效,即使手工定义了一个脚本,也仍需要修改WLS自带的相关脚本,这样有点麻烦。
经过多次试验,得出:
要想使WLS启动时(java
weblogic.Server)使用自定义脚本中的MEM_ARGS变量,需除去WLS自带的启动脚本相关的所以脚本中原本已有的MEM_ARGS变量。
如果你已经在这些自带的脚本中自定义了MEM_ARGS变量,需要统统删掉。WLS启动时,找不到MEM_ARGS变量,自然会从你自定义的脚本中寻找MEM_ARGS变量,如果找到则用之,其他变量同理。
下面以MEM_ARGS参数的设置为例,阐述设置过程(假定你刚创建完域,还没在任何脚本中设置MEM_ARGS变量):
OS:WindowsXP
JVM:SunHotSpot JVM(WLS自带)
1.
WLS 8.1 sp1-6
1)
将%WL_HOME%/common/bin/commEnv.sh脚本中两段儿Sun)对应的代码块儿中的MEM_ARGS=……整行注释掉,形如:
…………………………
Sun)
JAVA_VM=-client
#MEM_ARGS="-Xms32m-Xmx200m -XX:MaxPermSize=128m"
;;
…………………………
Sun)
JAVA_VM=-server
#MEM_ARGS="-Xms32m-Xmx200m -XX:MaxPermSize=128m"
JAVA_OPTIONS="${JAVA_OPTIONS}-Xverify:none"
;;
…………………………
2)
在自定义的WLS启动脚本中增加MEM_ARGS变量的设置即可. 形如:
start_AS.sh
#!/bin/sh
exportMEM_ARGS="-Xms384m -Xmx512m -XX:PermSize=96m-XX:MaxPermSize=128m"
nohupsh startWebLogic.sh >> "${AdminServer_Name}.out@${suffix}"2>&1 &
2.
WLS 9 - WLS 11g通用的设置方法
到WLS9++版本中,WLS启动脚本的调用方式发生了一些变化,而且在后来的WLS11g中较前几个版本又做了变动,修改WLS自带的那些脚本中的MEM_ARGS变量变得麻烦起来。
经过观察,在setDomainEnv.sh中发现了一个空闲的变量USER_MEM_ARGS.
………………………………
ifNOT "%USER_MEM_ARGS%"=="" (
set MEM_ARGS=%USER_MEM_ARGS
而他非空时,其值将被赋给MEM_ARGS即可。所以只需在自定义的WLS启动脚本中将原本要赋值给MEM_ARGS变量的值,赋给USER_MEM_ARGS即可。这样,我们只需要在自定义的WLS启动脚本中添加这样一句:
start_AS.sh
#!/bin/sh
export USER_MEM_ARGS="-Xms384m -Xmx512m -XX:PermSize=96m -XX:MaxPermSize=128m"
nohup sh startWebLogic.sh >> "${AdminServer_Name}.out@${suffix}" 2>&1 &
综上所述,只要startWebLogic.sh、startManagedWebLogic.sh、setDomainEnv.sh、commEnv.sh中变量值为空的变量,你都可以在自定义的WLS启动脚本中将其赋值。如果上述几个脚本中变量值不为空,那么你在WLS启动脚本中重复的变量,则它将被上述几个脚本中的变量值所覆盖。
这些脚本中变量的优先级为(从左到右依次升高):
自定义的WLS启动脚本(start_AS.sh等) à commEnv.sh à (setDomainEnv.sh à) à startWebLogic.sh(startManagedWebLogic.sh,在WLS 8.1中这两个脚本的优先级相同,在WLS9 ++版本中,执行startManagedWebLogic.sh,其实就是在调用startWebLogic.sh,这时startManagedWebLogic.sh中的变量的优先级是较低的)。
Note:所谓的优先级,只是针对两个或以上的脚本中存在相同的变量,有不同的值。
在WLS 8.1版本中,如果start_AS.sh中设置了CLASSPATH变量及其值,那么它将被追加到CLASSPATH变量值的末尾,例如:
start_AS.bat
@echo off
set CLASSPATH=D:\lib\cos.jar
startWebLogic
WLS启动后,你将看到如下的结果:
CLASSPATH=D:\Install\WLS816\JROCKI~1\lib\tools.jar;D:\Install\WLS816\WEBLOG~1\server\lib\weblogic_sp.jar;D:\Install\WLS8
16\WEBLOG~1\server\lib\weblogic.jar;D:\Install\WLS816\WEBLOG~1\common\eval\pointbase\lib\pbserver44.jar;D:\Install\WLS81
6\WEBLOG~1\common\eval\pointbase\lib\pbclient44.jar;D:\Install\WLS816\JROCKI~1\jre\lib\rt.jar;D:\Install\WLS816\WEBLOG~1
\server\lib\webservices.jar;D:\lib\cos.jar
这是因为WLS启动相关的几个脚本中存在CLASSPATH变量的设置语句:
set CLASSPATH=%WEBLOGIC_CLASSPATH%;%POINTBASE_CLASSPATH%;%JAVA_HOME%\jre\lib\rt.jar;%WL_HOME%\server\lib\webservices.jar;%CLASSPATH%
而对于和weblogic.jar等WebLogic自带的JAR包不冲突的第三方JAR包导入时,可以使用这种方法,如果第三方的JAR包与WebLogic自带的JAR包冲突,而我们又在自定义的WLS启动脚本中设置了CLASSPATH,那么这里定义的JAR包将被WebLogic自带的JAR包覆盖,因为CLASSPATH变量中,WebLogic自带的JAR包靠前,自定义的WLS启动脚本中定义的变量优先级较低,又根据JVM ClassLoader的原理,相同的JAR包,谁在前面引用谁。
当然,你也可以修改startWebLogic.sh(cmd)脚本中的 CLASSPATH变量,使得你在自定义脚本中添加的jar包置于总的CLASSPATH变量值的最前边儿。
名词注解:
A. 自定义的WLS启动脚本
指的是用户重新定义的,非包含在${WL_HOME}/common/bin、${WL_HOME}/server/bin、${Domain_Home}、${Domain_Home}/bin等目录下的脚本。