0

install4jを使用してWindowsサービスを作成しましたが、すべてが機能しますが、コマンドライン引数をサービスに渡す必要があります。新しいサービスウィザードでサービスの作成時に構成できることはわかっていますが、引数をregisterserviceコマンドに渡すことを望んでいました。

myservice.exe --install --arg arg1=val1 --arg arg1=val2 "My Service Name1"

または、次のように.vmoptionsファイルに配置します。

-Xmx256m
arg1=val1
arg2=val2

これを行う唯一の方法は、コードを変更してexe4j.launchNameを介してサービス名を取得し、その特定のサービスに必要な構成を持つ他のファイルまたは環境変数をロードすることです。私は過去にJava用の他のサービス作成ツールを使用しましたが、それらはすべて、ユーザーが登録したコマンドライン引数を直接サポートしていました。

4

1 に答える 1

1

1月にこれを尋ねたのは知っていますが、これを理解したことはありますか?

val1、val2などをどこから調達しているのかわかりません。それらは、インストールプロセスのフォームのフィールドにユーザーによって入力されていますか?彼らがそうだと仮定すると、これは私がしばらく前に直面した問題と同様の問題です。

これに対する私のアプローチは、必要なフィールド(テキストフィールドオブジェクトとして)を備えた構成可能なフォームを用意し、明らかにテキストフィールドの値(テキストフィールドの「ユーザー入力/変数名」カテゴリの下)に変数を割り当てることでした。

インストールプロセスの後半で、「スクリプトの実行」アクションがJavaでアタッチされた「進行状況の表示」画面が表示され、やりたいことが達成されました。

この方法でinstall4jに変数をオプションで設定する場合、2つの「落とし穴」があります。まず、変数は、空の文字列だけであっても、何があっても設定する必要があります。したがって、ユーザーがフィールドを空白のままにした場合(つまり、その引数をサービスに渡したくない場合)、実行可能ファイルの実行またはサービスの起動タスクに空の文字列を提供する必要があります(これについては後で詳しく説明します)。 )次に、引数にスペースを含めることはできません。スペースで区切られたすべての引数には、独自の行が必要です。

それを念頭に置いて、これがあなたが望むものを達成するかもしれない実行スクリプトコードスニペットです:

final String[] argumentNames = {"arg1", "arg2", "arg3"};
// For each argument this method creates two variables. For example for arg1 it creates
// arg1ArgumentIdentifierOptional and arg1ArgumentAssignmentOptional.
// If the value of the variable set from the previous form (in this case, arg1) is not empty, then it will
// set 'arg1ArgumentIdentifierOptional' to '--arg', and 'arg1ArgumentAssignmentOptional' to the string arg1=val1 (where val1 
// was the value the user entered in the form for the variable).
// Otherwise, both arg1ArgumentIdentifierOptional and arg1ArgumentAssignmentOptional will be set to empty.
//
// This allows the installer to pass both parameters in a later Run executable task without worrying about if they're
// set or not.

for (String argumentName : argumentNames) {
    String argumentValue = context.getVariable(argumentName)==null?null:context.getVariable(argumentName)+"";
    boolean valueNonEmpty = (argumentValue != null && argumentValue.length() > 0);
    context.setVariable(
       argumentName + "ArgumentIdentifierOptional",
       valueNonEmpty ? "--arg": ""
    );
    context.setVariable(
       argumentName + "ArgumentAssignmentOptional",
       valueNonEmpty ? argumentName+"="+argumentValue : ""
    );    
}

return true;

最後のステップは、サービスまたは実行可能ファイルを起動することです。サービスがどのように機能するかはよくわかりませんが、実行可能ファイルを使用してタスクを作成し、[引数]フィールドを編集して、行で区切られた値のリストを指定します。

したがって、あなたの場合、次のようになります。

--install
${installer:arg1ArgumentIdentifierOptional}
${installer:arg1ArgumentAssignmentOptional}
${installer:arg2ArgumentIdentifierOptional}
${installer:arg2ArgumentAssignmentOptional}
${installer:arg3ArgumentIdentifierOptional}
${installer:arg3ArgumentAssignmentOptional}

「私のサービス名1」

以上です。他の誰かがこれをより良くする方法を知っているなら、この方法を自由に改善してください(これはinstall4j 4.2.8、ところでです)。

于 2012-07-10T00:42:23.317 に答える