Рубрики
Без рубрики

Исходный код Одного Файла Java 11

Узнайте о новой функции Java 11 для однофайловых программ с исходным кодом

Автор оригинала: Ganesh Pagade.

1. введение

JDK 11 , который является реализацией Java SE 11, выпущен в сентябре 2018 года.

В этом уроке мы рассмотрим новую функцию Java 11 для запуска однофайловых программ с исходным кодом.

2. До Java 11

Однофайловая программа-это программа, в которой программа помещается в один исходный файл.

До Java 11, даже для однофайловой программы, мы должны были следовать двухэтапному процессу запуска программы.

Например, если файл называется HelloWorld.java содержит класс с именем HelloWorld с методом main () , нам придется сначала скомпилировать его:

$ javac HelloWorld.java

Это приведет к созданию файла класса, который нам придется запустить с помощью команды:

$ java HelloWorld
Hello Java 11!

Такие программы являются стандартными на ранних стадиях изучения Java или при написании небольших служебных программ. В этом контексте немного церемониально компилировать программу перед ее запуском.

Но разве не было бы здорово вместо этого просто иметь одноэтапный процесс? Java 11 пытается решить эту проблему, позволяя нам запускать такие программы непосредственно из источника.

3. Запуск Однофайловых Программ С исходным кодом

Начиная с Java 11, мы можем использовать следующую команду для выполнения однофайловой программы:

$ java HelloWorld.java
Hello Java 11!

Обратите внимание, как мы передали имя файла исходного кода Java, а не класс Java в Ява команда.

JVM компилирует исходный файл в память, а затем запускает первый общедоступный главный() метод, который он находит.

Мы получим ошибки компиляции, если исходный файл содержит ошибки, но в противном случае он будет работать так же, как если бы мы его уже скомпилировали.

4. Параметры командной строки

Программа запуска Java представила новый режим исходного файла для поддержки этой функции. Режим исходного файла включен, если выполняется одно из следующих двух условий:

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

Если файл не соответствует стандартным соглашениям об именовании исходных файлов Java, нам необходимо использовать параметр –source . Мы подробнее поговорим о таких файлах в следующем разделе.

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

Например, у нас есть файл с именем Addition.java , который содержит класс Addition . Этот класс содержит метод main () , который вычисляет сумму его аргументов:

$ java Addition.java 1 2 3

Кроме того, мы можем передать параметры типа –class-path перед именем файла:

$ java --class-path=/some-path Addition.java 1 2 3

Теперь, мы получим ошибку, если в пути к классу приложения есть класс с тем же именем, что и класс, который мы выполняем .

Например, предположим, что в какой-то момент во время разработки мы скомпилировали файл, присутствующий в нашем текущем рабочем каталоге, с помощью javac :

$ javac HelloWorld.java

Теперь у нас есть и то, и другое HelloWorld.java и 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

Такие файлы называются “shebang files”.

Теперь мы можем выполнять однофайловые программы 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

Параметр –source необходим, даже если он уже присутствует в файле. Shebang в файле игнорируется и рассматривается как обычный файл java без расширения .java .

Однако мы не можем рассматривать файл .java как файл shebang, даже если он содержит допустимый shebang. Таким образом, следующее приведет к ошибке:

$ ./Addition.java
./Addition.java:1: error: illegal character: '#'
#!/usr/local/bin/java --source 11
^

Последнее, что следует отметить о файлах shebang,-это то, что директива делает файл зависимым от платформы. Файл не будет использоваться на таких платформах, как Windows, которая изначально его не поддерживает.

6. Заключение

В этой статье мы увидели новую функцию исходного кода с одним файлом, представленную в Java 11.

Как обычно, фрагменты кода можно найти на GitHub .