Каковы ограничения JShell?

Я нашел вопрос это и этот разное, настолько интригующий, что он вызывает несколько вопросов, по крайней мере, для меня:

Скорее открытый вопрос, а куда девать 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.

Бонусные баллы за диаграммы Венна или другие визуальные эффекты.

Разумеется, размер сниппетов должен быть ограничен. Я больше спрашиваю, какие проблемы нельзя решить с помощью сниппетов.

смотрите также:

https://openjdk.java.net/jeps/222

https://openjdk.java.net/jeps/330

Да, это открытый вопрос, и он, по-видимому, слишком широк, чтобы на него можно было ответить и по SO. Возможно, обратитесь к соответствующим JEP, чтобы начать с openjdk.java.net/jeps/222 и openjdk.java.net/jeps/330

Naman 20.12.2018 12:29

JShell существует потому, что некоторые люди говорят, что Java должен иметь - это средство REPL. Мне он никогда не понадобился.

Holger 20.12.2018 12:38

Пытался немного сузить круг вопросов, @nullpointer. Но, да, сам утилиты не вижу. Это интригует и в то же время так ограниченно.

Thufir 20.12.2018 12:55

Черт, ты изменил ответ, пока я отвечал на него. Ну что ж, в процессе я кое-чему научился. Пора начать блог.

tucuxi 20.12.2018 12:57

@tucuxi, пожалуйста :) в любом случае, отличный ответ. а где мои фотки !?

Thufir 20.12.2018 12:59

Все проблемы может решаются с помощью сниппетов (да и с помощью достаточно сложного сценария оболочки). Но JShell лучше всего использовать для отладки и изучения java - полноценная программа намного более гибкая для всех других сценариев использования.

tucuxi 20.12.2018 12:59

Добавил картинку

tucuxi 20.12.2018 13:09

спасибо, @nullpointer. Я собираюсь вернуться к JShell, но это довольно интересно. Я определенно могу использовать его в качестве учебного пособия.

Thufir 29.12.2018 17:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
17
8
1 431
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Отвечая на обновленный вопрос

Все проблемы можно решить с помощью сниппетов (а также с помощью достаточно сложного сценария оболочки). Но 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 хотел изображение: Venn diagram showing how JShell, .jsh and JEP330 intersect

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), но

  • у него очень хороший цикл REPL
  • вы можете выполнять короткие программы намного проще

Похоже, это не работает в openJDK 14 на Mac. Я получаю сообщение «ошибка компиляции» из / после # !. Если я удалю строку shebang, запуск java непосредственно в исходном файле будет работать.

John 31.07.2020 14:35

@John Mac, вероятно, использует другой путь к исполняемому файлу java (так что «исправьте расположение jdk, прежде чем пытаться его запустить» :-)

tucuxi 25.08.2020 09:01

Ну, конечно, это ограничивается обычной утилитой REPL с точки зрения определения того, что может предоставить IDE и графический пользовательский интерфейс. Я бы сказал больше о его возможностях по сравнению с программами с одним исходным кодом. Особенности, которые отличают его от программ с одним исходным кодом:

  • история с редактированием
  • завершение табуляции
  • автоматическое добавление необходимых конечных точек с запятой и
  • настраиваемый предопределенный импорт и определения

Как уже упоминалось в альтернативах Однофайловые программы с исходным кодом JEP:

We could delegate the task of "one-off runs" to the jshell tool. While this may at first seem obvious, this was an explicit non-goal in the design of jshell.

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, а не просто при чтении документации, будут:

!!! Возможности и многое другое !!!

Более подробная информация по ссылкам, которые дают ему преимущество над программами с исходным кодом одного файла:

Другие вопросы по теме