Я нашел вопрос это и этот разное, настолько интригующий, что он вызывает несколько вопросов, по крайней мере, для меня:
Скорее открытый вопрос, а куда девать jshellограниченный? Очевидно, что приложения с графическим интерфейсом не относятся к решениям jshell или замене IDE:
Out of scope are graphical interfaces and debugger support. The JShell API is intended to allow JShell functionality in IDEs and other tools, but the jshell tool is not intended to be an IDE.
Бонусные баллы за диаграммы Венна или другие визуальные эффекты.
Разумеется, размер сниппетов должен быть ограничен. Я больше спрашиваю, какие проблемы нельзя решить с помощью сниппетов.
смотрите также:
JShell существует потому, что некоторые люди говорят, что Java должен иметь - это средство REPL. Мне он никогда не понадобился.
Пытался немного сузить круг вопросов, @nullpointer. Но, да, сам утилиты не вижу. Это интригует и в то же время так ограниченно.
Черт, ты изменил ответ, пока я отвечал на него. Ну что ж, в процессе я кое-чему научился. Пора начать блог.
@tucuxi, пожалуйста :) в любом случае, отличный ответ. а где мои фотки !?
Все проблемы может решаются с помощью сниппетов (да и с помощью достаточно сложного сценария оболочки). Но JShell лучше всего использовать для отладки и изучения java - полноценная программа намного более гибкая для всех других сценариев использования.
Добавил картинку
спасибо, @nullpointer. Я собираюсь вернуться к JShell, но это довольно интересно. Я определенно могу использовать его в качестве учебного пособия.




Отвечая на обновленный вопрос
Все проблемы можно решить с помощью сниппетов (а также с помощью достаточно сложного сценария оболочки). Но JShell лучше всего использовать для отладки и изучения java - полноценная программа намного более гибкая для всех других сценариев использования.
JShell, .jsh и java MyClass.java
JShell - это интерактивная оболочка для тестирования кода Java. По сути, это REPL для Java.
Поскольку JShell - это все о том, что вы вводите фрагменты кода, которые затем он оценивает, и часто имеет смысл поместить эти фрагменты в файл вместо того, чтобы писать их несколько раз, JShell поддерживает сценарии .jsh, которые содержат коллекции фрагментов, которые интерпретируются JShell. . В этом смысле это похоже на то, как bash принимает файлы .sh или command.com принимает файлы .bat - ввод их построчно эквивалентен их импорту.
Выполнение java-файла с одним исходным кодом - совсем другой зверь. Это сахар, который заменяет, начиная с JDK 11 и далее,
java MyClass.java arg1 arg2 arg3
вашим локальным сценарием, эквивалентным написанию
TMPDIR=$(mktemp -d)
javac -d $TMPDIR MyClass.java
java -cp $TMPDIR MyClass arg1 arg2 arg3
rm -rf $TMPDIR
Это позволяет быстро запускать файлы с одним исходным кодом из командной строки с помощью одной команды и не оставлять их скомпилированные классы повсюду (не нужно создавать фактический временный каталог, поскольку java может хранить эти классы в памяти). Поскольку у них уже было 3 других режима выполнения в java (для классов, jar-файлов и модулей), добавление этого в качестве четвертого - не большая проблема.
Поскольку OP хотел изображение:

Java как язык сценариев
Теперь, когда различие ясно (.jsh предназначен для использования с JShell, исполняемые файлы java с одним исходным кодом предназначены только, как вы догадались, исполняемые файлы java с одним исходным кодом), как насчет использования Java в качестве языка сценариев?
У вас всегда была возможность написать программу запуска; Например,
#!/bin/bash
java -jar MyApp.jar
работал целую вечность. Было технически возможно назвать класс напрямую, но это было не слишком полезно, поскольку файлы jar намного удобнее при распространении двоичных файлов - во-первых, они избегают зеркального отображения структуры пакета в виде набора папок. Тем не менее, наличие сценария запуска отдельно от фактического java-кода было несколько недружелюбным: теперь вам нужно держать оба вместе или, по крайней мере, дать возможность запускать фактический .jar для запуска.
Теперь они также ввели следующий ярлык: независимо от имени или расширения файла, вы можете распространять исходный код java с «префиксом shebang» следующим образом:
#!/path/to/java --source 11
<source of MyClass.java>
отметьте его как исполняемый и запустите из командной строки так же, как вы можете запустить любой другой исполняемый файл. Например, скопируйте и вставьте это в файл helloworld (и исправьте расположение jdk перед попыткой его запуска):
#!/opt/jdk-11.0.1/bin/java --source 11
public class Test {
public static void main(String ... args) {
System.out.println("Hello " + (args.length == 0 ? "world!" : args[0]));
}
}
Отметив его как исполняемый файл, вы можете запустить его напрямую с помощью
$ ./helloworld
Hello world!
и он даже принимает свои аргументы правильно:
$ ./helloworld Bob!
Hello bob!
Для небольших программ и при условии, что вам не нужно выходить за пределы JDK для подключения дополнительных библиотек, теперь будет намного проще распространять код Java для использования в командной строке.
Java по-прежнему не будет «языком сценариев» (он никогда не будет конкурировать, скажем, с python), но
Похоже, это не работает в openJDK 14 на Mac. Я получаю сообщение «ошибка компиляции» из / после # !. Если я удалю строку shebang, запуск java непосредственно в исходном файле будет работать.
@John Mac, вероятно, использует другой путь к исполняемому файлу java (так что «исправьте расположение jdk, прежде чем пытаться его запустить» :-)
Ну, конечно, это ограничивается обычной утилитой REPL с точки зрения определения того, что может предоставить IDE и графический пользовательский интерфейс. Я бы сказал больше о его возможностях по сравнению с программами с одним исходным кодом. Особенности, которые отличают его от программ с одним исходным кодом:
Как уже упоминалось в альтернативах Однофайловые программы с исходным кодом JEP:
We could delegate the task of "one-off runs" to the
jshelltool. While this may at first seem obvious, this was an explicit non-goal in the design ofjshell.The
jshelltool was designed to be an interactive shell, and many design decisions were made in favor of providing a better interactive experience.Burdening it with the additional constraints of being the batch runner would detract from the interactive experience.
С другой стороны, некоторые ограничения (предполагаемые функциональные возможности), которые можно найти в основном при практическом использовании JShell, а не просто при чтении документации, будут:
использование конечных переменных конечные переменные плохо работают в jshell
конечно Отладка с помощью JShell
интеграция jshell с IDE Java 11 JShell внутри Intellij IDEA
отключение истории Отключить историю JShell
повторно объявленные переменные должны быть сброшены Почему в jshell-11 у повторно объявленной ссылочной переменной, которая сбрасывается до нуля, все еще есть тип?
создать модуль с помощью jshell Создать модуль в JShell в Java 9
импорт частных классов пакетов Импорт частных классов пакета в JShell
объем объектов Доступ к «родительской области» в JShell
очистить консоль jshell Как очистить консоль Java 9 JShell?
Более подробная информация по ссылкам, которые дают ему преимущество над программами с исходным кодом одного файла:
почему и как Почему и как вы используете JShell?
путь к классам импорта для проекта В JShell, как импортировать путь к классам из проекта Maven
запустить приложение через JShell Как запустить Java-приложение с помощью jshell?
установить пользовательские режимы обратной связи Создайте собственный режим обратной связи в jshell
загружать скрипты при запуске Различные способы загрузки скрипта при запуске jshell
список активных методов Список всех активных методов в jshell
запустить файл jshell Как запустить файл JShell?
выполнить javascript с помощью jshell Как выполнить java-скрипт с jshell?
как использовать ссылки на методы в jshell Есть ли способ использовать ссылки на методы для функций верхнего уровня в jshell?
Да, это открытый вопрос, и он, по-видимому, слишком широк, чтобы на него можно было ответить и по SO. Возможно, обратитесь к соответствующим JEP, чтобы начать с openjdk.java.net/jeps/222 и openjdk.java.net/jeps/330