Java 11 Single File Source Code

Исходный код одного файла 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 для поддержки этой функции. Режим исходного файла включается, если выполняется одно из следующих двух условий:

  1. Первый элемент командной строки, за которым следуют параметры JVM, - это имя файла с расширением.java.

  2. Командная строка содержит параметр версии–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.