4

管理サーバー、NodeManager、および 1 つの管理対象サーバーがすべて同じマシン上にあります。[サーバーの開始] タブの引数フィールドに、次のようなものを入力しようとしています。

-Dmy.property=%USERPROFILE%\someDir\someJar.jar

しかし、管理対象サーバーが開始されると、次の例外がスローされます。

zip ファイルを開く際のエラーまたは JAR マニフェストが見つかりません: %USERPROFILE%\someDir\someJar.jar

環境変数がその値に変換されていないようです。プレーンテキストとして管理対象サーバーに渡されるだけです。パスを二重引用符 (") で囲んでみましたが、コンソールは入力を検証し、これを許可しません: "Arguments may not contain '"'"

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 として渡されるだけです。

おそらくこれは、(「C:\documents and settings..」である) の値のスペースと関係があると思いました %USERPROFILE%が、他の環境でも同じことが起こります。スペースなしで他のディレクトリを指す変数。

私の質問:

サポートされている方法はありますか:

  1. 二重引用符を使用していますか? 名前にスペースが含まれるフォルダを参照する必要がある場合はどうすればよいですか?

  2. 環境変数を参照しますか? 変数の値を事前に知らない分散サーバーの値に依存する必要がある場合はどうすればよいですか?

4

1 に答える 1

3

コメントに基づいて編集:

アプローチ 1:

  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 では、同様のロジックを使用できますが、バッチ スクリプト構文を使用できます。

アプローチ 2:

ドメインがすでにインストールされており、ユーザーが JVM 引数-Dmy.propertyを追加する必要があるサーバーのリストを提供すると仮定します。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」のホスト固有の値を設定するには、管理対象サーバーがデプロイされるすべてのホストからスクリプトを実行する必要があります。

ところで、あなたの質問に一行で答えるには、最終的にJVM引数にリテラルテキストを指定する必要があるようです。しかし、JVM 引数として提供された場合、WLS は環境変数を変換しないようです。startWebLogic.cmd (例: %DOMAIN_HOME% などを使用) から実行されたときに変換しているように見えますが、変換してから JVM を起動するシェル/cmd エグゼキューターです。

于 2012-09-28T06:06:25.107 に答える