Исходный код одного файла Java 11
1. Вступление
JDK 11 - реализация Java SE 11, выпущенная в сентябре 2018 года.
В этом руководстве мы рассмотрим новую функцию Java 11 для запуска программ с однофайловым исходным кодом.
2. До Java 11
Однофайловая программа - это программа, в которой программа помещается в один исходный файл.
До Java 11 даже для однофайловой программы нам приходилось выполнять двухэтапный процесс запуска программы.
Например, если файл с именемHelloWorld.java содержит класс с именемHelloWorld с методомmain(),we would have to first compile it:
$ javac HelloWorld.java
Это создаст файл класса, которыйwe would have to run using the command:
$ java HelloWorld
Hello Java 11!
Такие программы являются стандартными на ранних этапах изучения Java или при написании небольших служебных программ. В этом контексте довольно церемонно компилировать программу перед ее запуском.
But, wouldn’t it be great to just have a one-step process instead? Java 11 пытается решить эту проблему, позволяя нам запускать такие программы непосредственно из исходного кода.
3. Запуск однофайловых программ с исходным кодом
Начиная с Java 11, мы можем использовать следующую команду для выполнения однофайловой программы:
$ java HelloWorld.java
Hello Java 11!
Обратите внимание, как мы передали имя файла исходного кода Java, а не класс Java, командеjava.
JVM компилирует исходный файл в память, а затем запускает первый найденный общедоступный методmain().
Мы получим ошибки компиляции, если исходный файл содержит ошибки, но в противном случае он будет работать так же, как если бы мы его уже скомпилировали.
4. Параметры командной строки
Средство запуска Java представило новыйsource-file mode для поддержки этой функции. Режим исходного файла включается, если выполняется одно из следующих двух условий:
-
Первый элемент командной строки, за которым следуют параметры JVM, - это имя файла с расширением.java.
-
Командная строка содержит параметр версии–source
If the file does not follow the standard naming conventions for Java source files, we need to use the –source option. Подробнее о таких файлах мы поговорим в следующем разделе.
Any arguments placed after the name исходного файла в исходной командной строке передаются скомпилированному классу при его выполнении.
Например, у нас есть файлAddition.java, содержащий классAddition. Этот класс содержит методmain(), который вычисляет сумму своих аргументов:
$ java Addition.java 1 2 3
Также мы можем передать параметры вроде–class-path перед именем файла:
$ java --class-path=/some-path Addition.java 1 2 3
Теперьwe’ll get an error if there is a class on the application classpath with the same name as the class we are executing.
Например, допустим, в какой-то момент во время разработки мы скомпилировали файл, находящийся в нашем текущем рабочем каталоге, используяjavac:
$ javac HelloWorld.java
Теперь у нас есть обаHelloWorld.java and HelloWorld.class в текущем рабочем каталоге:
$ ls
HelloWorld.class HelloWorld.java
Но если мы попытаемся использовать режим исходного файла, мы получим ошибку:
$ java HelloWorld.java
error: class found on application class path: HelloWorld
5. Файлы Shebang
В системах, производных от Unix, таких как macOS и Linux, часто используется символ "#!" директива для запуска исполняемого файла сценария.
Например, сценарий оболочки обычно начинается с:
#!/bin/sh
Затем мы можем выполнить скрипт:
$ ./some_script
Такие файлы называются «файлами Шебанга».
Теперь мы можем выполнять однофайловые Java-программы, используя тот же механизм.
Если мы добавим следующее в начало файла:
#!/path/to/java --source version
Например, давайте добавим следующий код в файл с именемadd:
#!/usr/local/bin/java --source 11
import java.util.Arrays;
public class Addition
{
public static void main(String[] args) {
Integer sum = Arrays.stream(args)
.mapToInt(Integer::parseInt)
.sum();
System.out.println(sum);
}
}
И пометьте файл как исполняемый:
$ chmod +x add
Затем мы можем выполнить файл как скрипт:
$ ./add 1 2 3
6
Мы также можем явно использовать панель запуска для вызова файла shebang:
$ java --source 11 add 1 2 3
6
The –source option is required even if it’s already present in the file. Шебанг в файле игнорируется и рассматривается как обычный файл java без расширения.java.
Однако, we can’t treat a .java file as a shebang file, even if it contains a valid shebang. Таким образом, следующее приведет к ошибке:
$ ./Addition.java
./Addition.java:1: error: illegal character: '#'
#!/usr/local/bin/java --source 11
^
Последнее, что следует отметить в отношении файлов shebang, это то, что директива делает файл зависимым от платформы. The file will not be usable on platforms like Windows, which does not natively support it.с
6. Заключение
В этой статье мы увидели новую функцию исходного кода для одного файла, представленную в Java 11.
Как обычно, фрагменты кода можно найтиover on GitHub.