install4j: как передать аргументы командной строки в службу Windows - PullRequest
0 голосов
/ 06 января 2012

Я создал службу Windows, используя install4j, и все работает, но теперь мне нужно передать ее аргументы командной строки в службу. Я знаю, что могу настроить их во время создания сервиса в мастере нового сервиса, но я надеялся передать аргументы команде register service, например:

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

или поместив их в файл .vmoptions, например:

-Xmx256m
arg1=val1
arg2=val2

Кажется, что единственный способ сделать это - изменить мой код так, чтобы он выбирал имя службы через exe4j.launchName, а затем загружал некоторые другие переменные файла или среды, которые имеют необходимую конфигурацию для этой конкретной службы. В прошлом я использовал другие инструменты создания сервисов для Java, и все они имели прямую поддержку аргументов командной строки, зарегистрированных пользователем.

1 Ответ

1 голос
/ 10 июля 2012

Я знаю, что вы спрашивали об этом еще в январе, но вы когда-нибудь выясняли это?

Я не знаю, откуда вы берете val1, val2 и т. Д.Вводятся ли они пользователем в поля формы в процессе установки?Если предположить, что это так, то это проблема, аналогичная той, с которой я столкнулся некоторое время назад.

Мой подход для этого состоял в том, чтобы иметь настраиваемую форму с необходимыми полями (как объекты текстового поля) и, очевидно, иметь назначенные переменныек значениям текстовых полей (в категории «Пользовательский ввод / имя переменной» текстового поля).

Позже в процессе установки у меня был экран «Отображение хода выполнения» с подключенным к нему действием «Выполнить сценарий» снемного java для достижения того, что я хотел сделать.

Есть две ошибки, когда необязательно устанавливать переменные в install4j таким способом.Во-первых, переменная должна быть установлена ​​независимо от того, что, даже если это просто пустая строка.Таким образом, если пользователь оставляет поле пустым (то есть он не хочет передавать этот аргумент в службу), вам все равно нужно будет предоставить пустую строку для задачи «Выполнить исполняемый файл» или «Запуск службы» (подробнее об этом чуть позже)) Во-вторых, аргументы не могут иметь пробелов - у каждого аргумента, разделенного пробелами, должна быть своя собственная строка.

Имея это в виду, вот фрагмент кода Run script, который может достичь того, что вы хотите:

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}

"My Service Name1"

И все.Если кто-то еще знает, как это сделать, лучше смело улучшать этот метод (это для install4j 4.2.8, кстати).

...