Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > javaws command line


Автор: PashaOvechkin 19.3.2009, 13:35
Привет всем!
Мне необходимо передавать параметры в мейн метод, запуская ето через ЙНЛП.
Генерю строку и запускаю 

Код

ProcessBuilder pb = new ProcessBuilder( "javaws", "-open", params, JNLP_URL );


Реально строка выглядит так-> 
"javaws -open first,second,third  http://mybest.url.com/my.jnlp"

В но в http://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/javaws.html сказано что параметры должны передаватся 
так -> 
"javaws -open first second third  http://mybest.url.com/my.jnlp"
т.и не через запятую одним стрингом, а по нормальному, как и принято к командной строке.
Первый вариант у меня работает. Получаю все параметры в первом (т.и в нулевом) и сплитером разделяю их.

Может кто нить знает как сделать правильно? 
Откровенно говоря похоже на буг :\

Автор: LSD 19.3.2009, 13:43
Цитата(PashaOvechkin @  19.3.2009,  13:35 Найти цитируемый пост)
Откровенно говоря похоже на буг :\

Ты просто неправильно передаешь параметры в vararg метод.

Или params передавай не в массиве, а по одному. Или создай новый массив куда скопируй "javaws", "-open", params и JNLP_URL.

Автор: PashaOvechkin 19.3.2009, 13:53
Стоп стоп стоп...
забудем об етом ->
Код

ProcessBuilder pb = new ProcessBuilder( "javaws", "-open", params, JNLP_URL );


Есть строка "javaws -open first,second,third  http://mybest.url.com/my.jnlp"
если из кода 

Код

 public static void main(String[] args) {
        
               String a = args[0]; //                    

    }


то всё ок, и можно сплитить по ","

Если же строка = "javaws -open first second third  http://mybest.url.com/my.jnlp"
Код

public static void main(String[] args) {
        
               String a = args[1]; //   null pointer there     

Автор: LSD 19.3.2009, 13:58
Вообще нифига не понятно. Опиши чётко, что есть на входе и что надо получить на выходе.

Автор: PashaOvechkin 19.3.2009, 14:13
Боже... Нужно передать параметры в мейн метод, вызывая его веб стартом.

Используя командную строку.


у javaws есть команда -open, кототая способна ети параметры передать.

По всем правилам параметры передаются так -> "javaws http://mybest.url.com/my.jnlp -open first second third"

но таким образом я получаю лиш первый параметр.
И поетому придумал решение "javaws http://mybest.url.com/my.jnlp -open first,second,third"

т.и все пара,етры передаются в одном, в первом параметре.

А хотелось бы по человечески.

Автор: LSD 19.3.2009, 15:55
Заключи параметры в кавычки:
Код

ProcessBuilder builder = new ProcessBuilder("javaws", "http://mybest.url.com/my.jnlp", "-open", "\"first second third\"");

Автор: PashaOvechkin 19.3.2009, 16:20
хмм.. Помоему не прокатывало. Но попробую еще раз. Пасиб за совет!

Автор: aleksandy 20.3.2009, 10:27
PashaOvechkin, ты сигнатуру конструктора ProcessBuilder-а видел? Там ожидается массив строк на вход, таким образом твой 
Код

ProcessBuilder pb = new ProcessBuilder( "javaws", "-open", params, JNLP_URL );

нужно записать как-то так
Код

// полагаю что params - это массив или список строк
List<String> argsList = new ArrayList<String>();
argsList.add("javaws");
argsList.add("-open");
for (String param : params) {
  argsList.add(param);
}
argsList.add(JNLP_URL);
String[] args = new String[argsList.size()];
args = argsList.toArray(args);
ProcessBuilder pb = new ProcessBuilder(args);


З.Ы. Если содержимое params заранее известно, то можно сделать так:
Код

String[] args = new String[]{"javaws", "-open", params[i], JNLP_URL};
ProcessBuilder pb = new ProcessBuilder(args);


Автор: LSD 20.3.2009, 11:53
aleksandy,
params - это String, если бы params был бы String[] то была бы ошибка компиляции.

Автор: PashaOvechkin 20.3.2009, 12:56
ProcessBuilder ето последнее что интересует в етой ситуации...
Даже просто запуская через командную строку, 
"javaws http://mybest.url.com/my.jnlp -open first,second,third"

то в результате получаю ->
args[0] = "-open"
args[1] = "first,second,third"
args[2]  nullPointer
.
.
.
Вобщем то параметры передаются, всё ок, но хотелось добится что бы
запуская так -> "javaws http://mybest.url.com/my.jnlp -open first second third"
args[0] = "first"
args[1] = "second"
args[2] = "third"

Если параметры передавать в кавычках, как и советовал ЛСД, то они всё равно (естественно )все прийдут в 
args[1] = "first second third"

Видимо ето и есть единственный верный способ... 

Автор: LSD 20.3.2009, 16:20
Возможно javaws позволяет использовать несколько раз параметр -open, т.е.
Код

javaws http://mybest.url.com/my.jnlp -open param1 -open param2 -open param3

Автор: aleksandy 3.4.2009, 09:33
Цитата(LSD @ 20.3.2009,  11:53)
aleksandy,
params - это String, если бы params был бы String[] то была бы ошибка компиляции.

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ProcessBuilder.html#ProcessBuilder(java.lang.String...), парень
т.е. запись String... и String[] в сигнатуре метода одно...ственны. Разница лишь в том, что если
Код
void m(String[] a){}
, то вызывать его надо ТОЛЬКО ТАК 
Код
m(new String[] {});
, в смысле аргумент может быть только массивом, а если 
Код
void m(String... a){}
, то вызывать его МОЖНО ТАК 
Код
m(new String[] {});
 или так 
Код
m("", "", "")
, т.е. может быть:
1. либо один аргумент в виде массива строк;
2. сколько угодно аргументов типа String.

Автор: LSD 3.4.2009, 12:28
Цитата(aleksandy @  3.4.2009,  09:33 Найти цитируемый пост)
RTFM, парень
...

Прежде чем советовать другим RTFM, неплохо было бы вообще почитать о чем идет речь. И внимательно взглянуть на код.
Код

new ProcessBuilder( "javaws", "-open", params, JNLP_URL );

а теперь объясни как ты передашь в качестве params - String[] и не получишь при этом ошибку компиляции?

Автор: aleksandy 3.4.2009, 18:23
Цитата(LSD @ 3.4.2009,  12:28)
Прежде чем советовать другим RTFM, неплохо было бы вообще почитать о чем идет речь. И внимательно взглянуть на код.
Код

new ProcessBuilder( "javaws", "-open", params, JNLP_URL );

а теперь объясни как ты передашь в качестве params - String[] и не получишь при этом ошибку компиляции?

LSD, чуть выше я все написал, читай внимательнее. Где в предложенном мною варианте ошибка? Укажи, пожалуйста. Согласен, я немного не углядел, что в исходном коде params - это просто строка. Однако, я думаю ни для кого не секрет, что в цикле вида 
Код

for (String param : params) {...}
 под params понимается либо массив, либо итеррируемый объект. Следовательно, искомый цикл можно преобразовать в 
Код

for (String param : params.split(" ")) {...}
 

Автор: LSD 3.4.2009, 22:40
Цитата(aleksandy @  3.4.2009,  18:23 Найти цитируемый пост)
LSD, чуть выше я все написал, читай внимательнее. Где в предложенном мною варианте ошибка? Укажи, пожалуйста. Согласен, я немного не углядел, что в исходном коде params - это просто строка. Однако, я думаю ни для кого не секрет, что в цикле вида

Ошибка в то, что ты читаешь тему по диагонали (к вопросу о внимательном чтении smile ). Вопрос был только о том в какой формате передать параметры, чтобы они правильно дошли до приложения. А вовсе не о том как использовать vararg методы, и уж тем более не о foreach циклах. И я не говорил что ты пишешь неправильно, я говорил, что ты пишешь не по теме вопроса.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)