2016-04-04 6 views
0

Итак, я получил задание для создания приложения оболочки Java без использования каких-либо сторонних библиотек и без использования API Runtime.exec() или ProcessBuilder.Приложение для Linux Linux Shell

Я не хочу решения (очевидно, я хочу сделать это сам), но мне нужно понять, как это сделать? Я хочу, чтобы приложение открыло приглашение оболочки, которое будет принимать различные команды с использованием JDK 8 (Nashorn?).

Спасибо!

+1

Возможно, вы можете использовать JNI – Sanjeev

+0

Nashorn - это механизм Javascript (как в вашем браузере); не используя 'ProcessBuilder' или' Runtime.exec', потому что это будет очень сложно. Удачи. –

+0

Нужно ли принимать тот же самый набор команд, что и в Linux Bash Shell? Или вы могли бы просто создать свой собственный упрощенный интерпретатор команд? –

ответ

0

Не совсем понятно, чего вы хотите достичь. Если вы хотите запустить Nashhorn оболочки вы можете достичь его, как это (Java 8)

import jdk.nashorn.tools.Shell; 
public class NashornShell { 
    public static void main(String[] args) { 
     Shell.main(new String[]{ "-scripting"}); 
    } 
} 

Когда вы видите Nashorn подсказку jjs> вы можете выполнять команды Linux ...

jjs> $EXEC("ls"); 

который перечислит текущий каталог (с использованием команды Linux ls).

... или выполнять команды Java ...

jjs> java.lang.System.out.println("foo"); 

... или выполнять команды JavaScript ...

jjs> print("foo"); 

Для получения дополнительной информации посмотрите в nashorn guide.

Редактировать Если вы хотите передать только yourCommand в качестве параметра.

NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); 
ScriptEngine engine = factory.getScriptEngine(new String[]{"-scripting"}); 
String yourCommand = "ls"; 
Object eval = engine.eval("$EXEC(\"" + yourCommand + "\")"); 
System.out.println(eval); 

редактироватьdo you think that instead of Nashorn I could just use raw streams directed to the OS from JVM

Ниже можно

Commands.java

class Commands { 
    public static void main(String[] args) { 
     System.out.println("ls"); 
     System.out.println("whoami"); 
    } 
} 

run.sh

#!/bin/sh 
java Commands | while read command; do 
    echo 
    echo "command: $command" 
    $command 
done 

Но, очевидно, это не рекомендуется, если вы хотите execute выход Commands:

  • приложение Java не имеет никакого контроля о состоянии возврата выполненных одиночных команд
  • если одна команда ожидания для ввода пользователем ваше приложение Java не знает его
  • ваше приложение Java не имеет доступа к выходу, созданному командами
  • все команды вслепую выведены
  • и еще некоторые недостатки
+0

Что бы я хотел, это запустить приложение Java на оболочке Linux, которое будет принимать команды от пользователя без Process Builder или Runtime.exec –

+0

@ BartłomiejŁazarski Как все еще не ясно, какие команды вы хотите выполнить (в вашем первоначальном вопросе вы упомянул nashorn). Я обновил свой ответ, если что-то соответствует вашему требованию. Если вы не уточните свой вопрос. – SubOptimal

+0

Хорошо, оставь Нашона на мгновение. Мне нужно приложение Java (которое может работать на Linux/Windows - ofc изменилось немного), что позволит мне вводить команды, специфичные для моего приложения, и разрешать их выполнять в ОС. Например: я запускаю свое приложение в командной строке Windows. Я вижу smth вроде «Shell $>», который ждет команд. Если я наберу «bla bla bla», он выполнит «ls» или «dir» или любую другую команду в ОС. Но мне нужно, чтобы это было сделано без Process Builder или Runtime.exec или любых сторонних API только с JDK 8 –

0

Независимо от того, что вы пытаетесь сделать, используя Насхорн внутренний класс как jdk.nashorn.tools.Shell не является хорошей идеей. С java 9 этот пакет не является экспортированным пакетом jdk.scripting.nashorn модуль. Таким образом, с помощью java 9 вы получите отказ в доступе к пакету (даже при отсутствии диспетчера безопасности, поскольку проверка доступа к модулю чтения/экспорта модулей больше похожа на проверку доступа членов для классов).

Смежные вопросы