Невозможно выполнить java-программу из jsp с помощью Runtime.getRuntime().exec

Я пытаюсь запустить файл jar через jsp. Я использую команду Runtime.getRuntime().exec("java -jar file.jar");. Я получаю сообщение об ошибке Unable to access jarfile file.jar при печати потока ошибок.

Я попытался запустить с classpath, установленным в текущий каталог как Runtime.getRuntime().exec("java -cp . -jar file.jar");, но все равно получаю ту же ошибку. Я также попытался указать весь путь к файлу jar. Когда я это делаю, файл jsp зависает после выполнения оператора exec.

Это строка, которую я использую в окнах:

process = Runtime.getRuntime().exec("java -jar C:\\Users\\Jeff\\Documents\\NetBeansProjects\\WebApplication1\\file.jar");

Я использую пожиратель потоков, указанный в статье но та же проблема (зависает). Кто-нибудь может помочь?


person user1151450    schedule 16.01.2012    source источник
comment
Зачем вам нужно запускать файл jar из jsp?   -  person Reddy    schedule 16.01.2012
comment
Разве вы не можете вместо Runtime.exec включить файл jar в свое веб-приложение и напрямую вызвать соответствующий класс/функцию?   -  person Manish    schedule 16.01.2012


Ответы (2)


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

person aviad    schedule 16.01.2012
comment
согласен.. jar/исполняемый файл клиента не может быть доступен через JSP.. не уверен насчет Java Applet - person Avil; 16.01.2012
comment
JSP выполняется на сервере, а не на клиенте. JSP не имеют доступа к исполняемым файлам клиента. - person yatskevich; 16.01.2012
comment
@Yatskevitch, конечно, что соответствующая страница сервлета выполняется на сервере, это не то, что было сказано. - person aviad; 16.01.2012
comment
ответ неверный. в большинстве случаев он должен работать, он не будет работать, только если присутствует менеджер безопасности... и это не очень часто - person bestsss; 16.01.2012
comment
файл jar находится на сервере. У меня есть html-форма, которая отображается на стороне клиента. Когда нажимается кнопка отправки, jsp выполняется на сервере, и в качестве первого шага я хочу, чтобы jar выполнялся на серверной машине (в настоящее время localhost), а в качестве следующего шага выполняйте jar на удаленной машине с помощью ssh. - person user1151450; 16.01.2012
comment
@ user1151450 до сих пор не понимает, почему вам нужно сделать это, запустив исполняемый файл (java.exe) из JSP, а не напрямую запустив код в банке? - person aviad; 17.01.2012
comment
@bestsss, когда вы в последний раз видели коммерческий веб-сервер, работающий с отключенным securityManger? - person aviad; 17.01.2012
comment
@авиад, честно? сегодня. достаточно контролировать процесс с помощью ограничений ОС. - person bestsss; 17.01.2012
comment
@bestsss хорошо, я думаю, у тебя есть свои причины для этого. однако, судя по моему опыту, отключение securityManager в производственной среде не является хорошей идеей, и это не то, что ИТ-специалисты были бы рады сделать. - person aviad; 17.01.2012

Хотя лучше добавить jar в WEB-INF/lib и выполнять необходимые функции с помощью вызова метода или, по крайней мере, переместить код скриптлета в сервлет, совершенно законно использовать любые функции, предоставляемые Java, в скриптлетах JSP.

test.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Test</title>
  </head>
  <body>
  <%
    try {
      Runtime runtime = Runtime.getRuntime();
      Process exec = runtime.exec(new String[]{"java", "-cp", "/home/test/test.jar", "Main"});
      int i = exec.waitFor();
      System.out.println(i);
    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }
  %>
  hi
  </body>
</html>

test.jar содержит следующий класс:

Main.java

public class Main {

  public static void main(String[] args) {
    System.out.println('hello');
  }

}

Этот пример работает нормально. JSP печатает 0 в потоке вывода сервера, что означает, что ошибки не произошло.

Пока вы разрабатываете веб-приложение локально, ваша машина одновременно является сервером и клиентом. Это может вас смутить, поэтому вы должны понимать, что код из jar-файла, который вы пытаетесь запустить, будет выполняться на _сервере.

В вашем случае проблема вызвана кодом в самом файле jar. Попробуйте создать простой класс и посмотрите, работает ли он.

person yatskevich    schedule 16.01.2012