4

我有一个管理服务器、NodeManager 和 1 个托管服务器,它们都在同一台机器上。我正在尝试在“服务器启动”选项卡中的参数字段中输入与此类似的内容:

-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..”)的值中的空格有关,但其他环境也会发生同样的事情。指向其他没有空格的目录的变量。

我的问题:

是否有任何支持的方式:

  1. 使用双引号?如果我必须引用名称中带有空格的文件夹怎么办?

  2. 引用环境变量?如果我必须依赖它的值用于我事先不知道变量值的分布式服务器怎么办?

4

1 回答 1

3

根据评论编辑:

方法一:

  1. 打开 setDomainEnv.cmd 并export SERVER_NAME在 Linux 或set SERVER_NAMEWindows 中搜索。跳到下一行(即跳过当前和下一行)
  2. 在当前行,插入:

    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
    
  3. 保存 setDomainEnv.sh 文件并重新启动服务器

请注意,我只给出了 Linux 的逻辑,对于 Windows,可以使用类似的逻辑,但使用批处理脚本语法。

方法二:

假设 domain 已经安装并且用户提供了-Dmy.property需要添加 JVM 参数的服务器列表。Jython 脚本(使用 wlst.sh 执行)。WLST 参考

用法: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”。

BTW, to answer your question in a line : looks like the JVM arguments have to be supplied with the literal text eventually. But looks like WLS doesn't translate the environment variables if provided as JVM arguments. It gives an impression that it is translating when its done from startWebLogic.cmd (ex: using %DOMAIN_HOME% etc.) but its the shell/cmd executor that translates and then starts the JVM.

于 2012-09-28T06:06:25.107 回答