Runtime.getRuntime().exec(команда); С виртуальным жестким диском не работает?

Я сделал ниже:

subst A: "C\Desktop"

Теперь из java-кода:

String command= "java -jar A:\test.jar"
Process process = Runtime.getRuntime().exec(command);

Кажется, что JVM здесь зависает и никогда не выполняет эту строку. Когда я запускаю "java -jar C:\Desktop\test.jar"., он успешно выполняется.

Runtime.getRuntime не разрешает виртуальный жесткий диск? Спасибо


person yami    schedule 06.08.2012    source источник


Ответы (2)


Я предполагаю, что у вас есть \\t, а не \t, и вы читаете из потока ошибок, чтобы увидеть любые ошибки. \t — символ табуляции.

(Радости MS-DOS с использованием \ в качестве разделителя пути;)

Сбросьте ошибку, которую вы получаете, и вы должны увидеть проблему.

person Peter Lawrey    schedule 06.08.2012
comment
О, извините, у меня нет проблем с \\ t, я позабочусь об этом. Моя проблема связана с тем, что класс не найден. Я получаю эту ошибку: - person yami; 06.08.2012
comment
Вы используете более одной библиотеки? Jar может ссылаться на другой jar, и если путь не включает букву диска, он может использовать ту, которую вы не ожидаете. - person Peter Lawrey; 06.08.2012
comment
да, моя банка использует другую банку. Я попытался запустить его непосредственно из командной строки, и они также видят ту же проблему. Поэтому я чувствую, что это не связано с виртуальным приводом. Теперь я пытаюсь напрямую из командной строки, например: java -cp A:\depending.jar;A:\mytest.jar -jar mytest.jar, но это дает мне ошибку, например Unable to access jar file mytest.jar..Am я делаю что-то не так? - person yami; 06.08.2012
comment
можешь сделать DIR A:\ ? Я предполагаю, что ваш subst на самом деле должен быть subset A: C:\Desktop - person Peter Lawrey; 06.08.2012
comment
да, я могу, в проводнике папок он открывает нужное место. Я не уверен, что я не могу выполнять команды Java - person yami; 06.08.2012
comment
Попробуйте изменить на A: в командной строке и использовать java -jar test.jar - person Peter Lawrey; 06.08.2012
comment
Привет, я попробовал еще раз, проблема заключалась в том, что файл манифеста был вынужден использовать банки зависимостей из определенного места. Однако, если я пытаюсь изменить манифест, он выдает мне исключения безопасности. Есть два способа решить эту проблему: либо использовать класс непосредственно в коде Java, либо предоставить файлы зависимостей в модуле проекта, либо если мы хотим запустить его через Runteime. .exec, тогда нам нужно следовать структуре манифеста. Предоставление -classpath для зависимости не было прочитано (не знаю, почему?) - person yami; 08.08.2012

Javadoc java.lang.Process говорит

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

это означает, что вы не читаете и не записываете данные быстро, что вызывает переполнение буфера в связанном процессе. Это может быть возможной проблемой. Прочтите статью о javaworld и рассмотрите возможность реализации чтение и запись в отдельных потоках быстро.

person sakthisundar    schedule 06.08.2012