Как запустить файл .jar из программы Java?

То, что я в основном пытаюсь сделать здесь, - это запустить файл .jar, который находится в

C/Users/-any user here-/appdata/Roaming/-my folder here-/-file name here-.jar

Я как-то открываю CMD и делаю:

cd appdata/Roaming/<Folder>
java -jar <FileName>.jar

Кажется, это работает, когда я ввожу его в сам CMD. Кажется, я не могу заставить его работать при запуске из Java-программы.

Я пробовал делать:

Runtime.getRuntime().exec("cd appdata/Roaming");

И я получаю сообщение об ошибке, что указанный каталог не существует.


person user2098268    schedule 17.07.2013    source источник
comment
Несколько советов. Прочтите (и выполните) все рекомендации Когда Runtime.exec () не работает. Это могло бы решить проблему. Если нет, он должен предоставить дополнительную информацию о причине сбоя. Затем проигнорируйте, что он ссылается на exec, и создайте Process, используя ProcessBuilder. Также разбейте String arg на String[] args, чтобы учесть аргументы, которые сами содержат пробелы.   -  person Andrew Thompson    schedule 17.07.2013
comment
@AndrewThompson Мне кажется, это ответ, а не просто комментарий.   -  person Viktor Seifert    schedule 17.07.2013
comment
@ViktorSeifert Если бы на вопрос еще не был предложен (правильный) ответ, я мог бы отправить его как один. Конечно, это может стать ответом на несколько следующих вопросов, заданных OP. ;)   -  person Andrew Thompson    schedule 17.07.2013


Ответы (2)


Используйте абсолютный путь вместо относительного, это должно предотвратить то, что путь не будет найден, если вы запускаете из любого рабочего каталога. В противном случае добавьте его в свой путь к классам, как сказал Низил.

Чтобы получить имя текущего пользователя, используйте System.getProperty("user.name") и добавьте его в свой путь.

user = System.getProperty("user.name");
cmd = "java -jar C/Users/" + user + "/appdata/Roaming/<folder>/<file>.jar";
Runtime.getRuntime().exec(cmd);
person CrystalDuck    schedule 17.07.2013
comment
Как узнать имя пользователя? - person user2098268; 17.07.2013
comment
Объединить с переменной? Вы не можете использовать подстановочный знак для поиска пользователей, потому что тогда как узнать, какого пользователя выбрать, если пользователей несколько? - person CrystalDuck; 17.07.2013
comment
@ user2098268 См. принятый ответ в stackoverflow.com/questions/ 797549 / get-login-username-in-java, чтобы получить имя пользователя. - person Viktor Seifert; 17.07.2013
comment
Я добавлю это здесь. Спасибо @ViktorSeifert - person CrystalDuck; 17.07.2013
comment
Также я должен упомянуть, что cd-вход из запущенного процесса не означает, что рабочий каталог изменится для последующих вызовов Runtime.getRuntime().exec(...) . Это еще одна причина использовать абсолютный путь. - person Viktor Seifert; 17.07.2013
comment
У вас все еще есть команда cd. Я думаю, это должно быть java -jar, так как у вас есть баночка в конце команды. - person Viktor Seifert; 17.07.2013
comment
@ViktorSeifert Верно, плохо. Это было только для иллюстрации принципа, но java -jar действительно то, что искал спрашивающий, и поэтому может быть более подходящим. - person CrystalDuck; 17.07.2013
comment
Спасибо за код, попробую. Если это сработает, я сделаю это лучшим ответом. - person user2098268; 17.07.2013
comment
Большое Вам спасибо. Не может быть лучшего ответа :) - person user2098268; 17.07.2013

Вам просто нужно добавить путь к jar в свой путь к классам (не забудьте использовать абсолютный путь) и вызвать main метод jar в вашем коде. Однако это решение зависит от пользователя, так как путь будет жестко закодирован, если вы не хотите углубиться во что-то более сложное (Как изменить путь к классам в java).

person NiziL    schedule 17.07.2013
comment
Ой мальчик .. Вот почему я напечатал то, что мне нужно. Я делаю пусковую установку типа Minecraft, которая запускает мою игру, которая находится в appdata / Roaming, из любого места на компьютере. - person user2098268; 17.07.2013
comment
Что ж, если вы используете абсолютный путь, он будет. Но только на вашем компьютере, для вашего пользователя;) - person NiziL; 02.05.2015