我有一台管理服务器,NodeManager和一台托管服务器,都在同一台机器上。 我试图在Server Start选项卡的arguments字段中输入类似的内容:
-Dmy.property=%USERPROFILE%\someDir\someJar.jar
但是当托管服务器启动时,它会抛出此异常:
打开zip文件或缺少JAR清单时出错:%USERPROFILE%\ someDir \ someJar.jar
环境变量似乎没有被转换为它的值。它只是作为纯文本传递给托管服务器。 我尝试用双引号(“)围绕路径,但控制台验证输入并且不允许这样:”参数可能不包含'“'”
即使手动编辑config.xml文件也无法正常工作,因为管理服务器在此之后无法启动:
<Critical> <WebLogicServer> <BEA-000362> <Server failed. Reason: [Management:141266]Parsing failure in config.xml: java.lang
.IllegalArgumentException: Arguments may not contain '"'.>
我也尝试使用%20无效,它只是作为%20传递。
我认为这可能与%USERPROFILE%
(即“C:\ documents and settings ..”)的值中的空格有关,但同样的事情发生在其他环境中。指向其他没有空格的目录的变量。
我的问题:
是否有任何支持的方式:
使用双引号?如果我必须引用一个带有空格的文件夹,该怎么办?
引用环境变量?如果我不得不依赖它的分布式服务器的值,我不知道事先知道变量的值?
答案 0 :(得分:3)
根据评论进行编辑:
方法1:
export SERVER_NAME
或在Windows中搜索set SERVER_NAME
。跳到下一行旁边(即跳过当前行和下一行)在当前行上,插入:
customServerList="server1,server2" #this serverList should be taken as input
isCurrServerCustom=$(echo ${customServerList} | tr ',' '\n' | grep ${SERVER_NAME} | wc -l)
if [ $isCurrServerCustom -gt 0 ]; then
# add customJavaArg
JAVA_OPTIONS="-Dmy.property=${USERPROFILE}/someDir/someJar.jar"
fi
请注意,我只给出了Linux的逻辑,对于Windows,可以使用类似的逻辑,但使用批处理脚本语法。
方法2:
假设已经安装了域,并且用户提供了需要添加JVM参数-Dmy.property
的服务器列表。 Jython脚本(使用wlst.sh执行)。 WLST Reference。
用法:wlst.sh script_name props_file_location
import os
from java.io import File
from java.io import FileInputStream
# extract properties from properties file.
print 'Loading input properties...'
propsFile = sys.argv[1]
propInputStream = FileInputStream(propsFile)
configProps = Properties()
configProps.load(propInputStream)
domainDir = configProps.get("domainDir")
# serverList in properties file should be comma seperated
serverList = configProps.get("serverList")
# The current machine's logical name as mentioned while creating the domain has to be given. Basically the machine name on which NM for current host is configured on.
# This param may not be required as an input if the machine name is configured as same as the hostname , in which case , socket module can be imported and socket.getHostName can be used.
currMachineName = configProps.get("machineName")
jarDir = os.environ("USERPROFILE")
argToAdd = '-Dmy.property=' + jarDir + File.separator + 'someDir' + File.separator + 'someJar.jar'
readDomain(domainDir)
for srvr in serverList.split(",") :
cd('/Server/' + srvr)
listenAddr = get('ListenAddress')
if listenAddr != currMachineName :
# Only change current host's servers
continue
cd('/Server/' + srvr + '/ServerStart/' + srvr)
argsOld = get('Arguments')
if argsOld is not None :
set('Arguments', argsOld + ' ' + argToAdd)
else:
set('Arguments', argToAdd)
updateDomain()
closeDomain()
# now restart all affected servers (i.e serverList)
# one way is to connect to adminserver and shutdown them and then start again
必须从将要部署托管服务器的所有主机运行脚本,以便在JVM参数中具有主机特定值“USERPROFILE”。
顺便说一句,顺便回答你的问题:看起来最终必须为文字文本提供JVM参数。但看起来如果作为JVM参数提供,WLS不会转换环境变量。它给人的印象是,它从startWebLogic.cmd(例如:使用%DOMAIN_HOME%等)完成后进行翻译,但是它是转换然后启动JVM的shell / cmd执行器。