Как запустить приложение Java с JShell?
Как запустить приложение Java с JShell? Он должен иметь возможность указывать classpath и вызывать команду java и передавать некоторые аргументы, как это делает bash, например:
#!/bin/bash
$ARGS=...
$CLASSPATH=...
java -cp $CLASSPATH $ARGS com.example.MyApp
Обновить:
Я думаю, что обертка Runtime или Process требуется, например,
jshell> private String executeCommand(String command) {
...>
...> StringBuffer output = new StringBuffer();
...>
...> Process p;
...> try {
...> p = Runtime.getRuntime().exec(command);
...> p.waitFor();
...> BufferedReader reader =
...> new BufferedReader(new InputStreamReader(p.getInputStream()));
...>
...> String line = "";
...> while ((line = reader.readLine())!= null) {
...> output.append(line + "\n");
...> }
...>
...> } catch (Exception e) {
...> e.printStackTrace();
...> }
...>
...> return output.toString();
...>
...> }
| Created method executeCommand(String)
jshell> String out =executeCommand("java --version");
out ==> "java 9.0.4\nJava(TM) SE Runtime Environment (bui ... d 9.0.4+11, mixed mode)\n"
jshell> System.out.println(out);
java 9.0.4
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
2 ответа
Ваш код не работает, так как вы ожидаете завершения команды сначала и только потом читаете канал. Если команда производит больше выходных данных, чем канал может буферизовать, команда будет заблокирована и никогда не завершится, так как никто не читает канал в этот момент.
В идеальном мире вы бы просто использовали
new ProcessBuilder(your command and args).inheritIO().start().waitFor()
как в обычном приложении Java. К несчастью, jshell
изменяет стандартные файловые дескрипторы таким образом, что это не работает (по крайней мере, в версии Windows, которую я тестировал).
Ты можешь использовать
void run(String... arg) throws IOException, InterruptedException {
Path tmp = Files.createTempFile("run", ".tmp");
try {
new ProcessBuilder(arg).redirectErrorStream(true).redirectOutput(tmp.toFile())
.start().waitFor();
Files.lines(tmp, java.nio.charset.Charset.defaultCharset())
.forEach(System.out::println);
}
finally { Files.delete(tmp); }
}
и назовите это как, например,
run("java", "-version")
или же
run("java", "-d", "java.base")
Для запуска любого приложения в jshell сначала установите classpath на jshell при запуске.
Пример:
jshell -class-path /Users/sree/Desktop/libs/jettison-1.0.1.jar
Затем импортируйте класс в среду выполнения
import org.codehaus.jettison.json.JSONObject;
Это импортирует требуемый класс в среду.
Теперь запустите необходимое приложение. В моем случае я вошел
String myString = new JSONObject().put("JSON", "Hello, World!").toString()
И вернул вывод
myString ==> "{\"JSON\":\"Hello, World!\"}"
отвечая на вопрос о передаче аргументов командной строки. Вы должны инициировать класс со всеми значениями.
Test instance = new Test("data","data1")