Ответ на обновленный вопрос
Все проблемы можно решить с помощью фрагментов кода (и с помощью достаточно сложного сценария оболочки).Но 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), но
- имеет очень хороший цикл REPL
- Вы можете выполнять короткие программы намного проще