Java ProcessBuilder

У меня возникают проблемы с использованием ProcessBuilder для запуска класса в моем проекте. Мой код:

public class Main {
    public static void main(String[] args) {
        try {
            String pathToJar = Main.class.getProtectionDomain().getCodeSource()
                    .getLocation().toURI().getPath();
            ArrayList<String> params = new ArrayList<String>();    
            params.add("javaw");
            params.add("-classpath");
            params.add(pathToJar);
            params.add("Program");
            ProcessBuilder pb = new ProcessBuilder(params);
            Process process = pb.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Program находится в том же проекте (та же папка bin) и отлично работает, если запускалась напрямую, но таким образом я получаю сообщение об ошибке «Не удалось найти основной класс: Program». Где ошибка в моем коде?

Заранее спасибо.

[EDIT] Я пришел к выводу, что какой-то код в моем классе Program дает ошибку. В основном работает только с «чистым» файлом main. В eclipse класс Program импортирует некоторые библиотеки, находящиеся внутри файла jar. Мне не нужно ссылаться на него в ProcessBuilder? Если да, то как?


person Ciro    schedule 13.05.2012    source источник
comment
В каком пакете находится класс Program? В params.add("Program"); вам необходимо указать полное имя класса.   -  person Jim Garrison    schedule 13.05.2012
comment
ни один из классов не имеет package. В любом случае поместите оба в пакет build.test, чтобы изменить params.add("build.test.Program");. Все та же ошибка   -  person Ciro    schedule 13.05.2012
comment
Вы пытались вывести значение pathToJar? Это то, что вы ожидаете?   -  person Jim Garrison    schedule 13.05.2012
comment
Да, все в порядке. Кроме того, если я перехожу к Windows cmd, прямо в каталог и выполняю javaw build.test.Main, работает, а javaw build.test.Program - нет.   -  person Ciro    schedule 13.05.2012
comment
Отредактируйте свой пост и включите копию/вставку ПОЛНОЙ трассировки стека   -  person Jim Garrison    schedule 13.05.2012
comment
Попробуйте params.add(System.getProperty("java.class.path").concat(";").concat(pathToJar)); заменить params.add(pathToJar).   -  person Krrose27    schedule 13.05.2012


Ответы (2)


В ответ на ваше редактирование:

Вы можете добавить текущий путь, переключив params.add(pathToJar); на params.add(System.getProperty("java.class.path").concat(";").concat(pathToJar))‌​;.

person Krrose27    schedule 13.05.2012

Где ошибка в моем коде?

(Вы запускаете исполняемый файл javaw, так что это не проблема. Это также не значит, что подпись вашего метода точки входа неверна, потому что это дало бы другую диагностику.)

Проблема заключается либо в неправильном имени класса (например, if должно быть "come.pkg.Program"), либо в неверном пути к JAR-файлу.


Предполагая, что вы устранили возможность неправильного имени класса, я предполагаю, что вы пытаетесь использовать относительный путь для файла JAR, но есть некоторая путаница в отношении того, что такое текущий каталог; то есть каталог, в котором необходимо разрешить путь. Попробуйте использовать абсолютный путь в параметре classpath.

person Stephen C    schedule 13.05.2012
comment
печатный jarpath, все в порядке. Также протестировано с пакетом, та же ошибка. - person Ciro; 13.05.2012
comment
Я могу ошибаться насчет точки входа. Если ничего из вышеперечисленного не помогает, покажите нам сигнатуру класса Program и его метода main. - person Stephen C; 13.05.2012