WebLogic - 在“服务器启动”中的“参数”中使用环境变量/双引号

时间:2012-09-27 20:19:12

标签: weblogic weblogic-10.x weblogic11g weblogic12c

我有一台管理服务器,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 ..”)的值中的空格有关,但同样的事情发生在其他环境中。指向其他没有空格的目录的变量。

我的问题:

是否有任何支持的方式:

  1. 使用双引号?如果我必须引用一个带有空格的文件夹,该怎么办?

  2. 引用环境变量?如果我不得不依赖它的分布式服务器的值,我不知道事先知道变量的值?

1 个答案:

答案 0 :(得分:3)

根据评论进行编辑:

方法1:

  1. 打开setDomainEnv.cmd并在Linux中搜索export SERVER_NAME或在Windows中搜索set SERVER_NAME。跳到下一行旁边(即跳过当前行和下一行)
  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文件并重新启动服务器
  4. 请注意,我只给出了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执行器。