Вихідний код для одного файлу Java 11

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 команді java .

JVM компілює вихідний файл у пам'ять, а потім запускає перший відкритий метод main (), який він знаходить.

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

4. Параметри командного рядка

Запуск Java ввів новий режим вихідного файлу для підтримки цієї функції. Режим вихідного файлу вмикається, якщо виконується одна з наступних двох умов:

  1. Першим елементом командного рядка, за яким слідують параметри JVM, є ім'я файлу з розширенням .java
  2. Командний рядок містить параметр –source version

Якщо файл не відповідає стандартним правилам іменування вихідних файлів Java, нам потрібно використовувати параметр –source . Про такі файли ми поговоримо далі в наступному розділі.

Будь-які аргументи, розміщені після імені вихідного файлу в оригінальному командному рядку, передаються до скомпільованого класу при його виконанні.

Наприклад, у нас є файл з назвою Addition.java, який містить клас Addition . Цей клас містить метод main (), який обчислює суму аргументів:

$ java Addition.java 1 2 3

Крім того, ми можемо передавати параметри like –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. Файли Шебанг

У системах, похідних від Unix, таких як macOS та Linux, часто використовується символ "#!" для запуску виконуваного файлу сценарію.

Наприклад, сценарій оболонки зазвичай починається з:

#!/bin/sh

Потім ми можемо виконати сценарій:

$ ./some_script

Такі файли називаються «файлами shebang».

Тепер ми можемо виконувати однофайлові програми 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 як файл шебанга , навіть якщо він містить дійсний шебанг. Таким чином, наступне призведе до помилки:

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

Останнє, на що слід звернути увагу щодо файлів shebang, це те, що директива робить файл залежним від платформи. Файл не використовуватиметься на таких платформах, як Windows, яка його в основному не підтримує.

6. Висновок

У цій статті ми побачили нову функцію вихідного коду для одного файлу, представлену в Java 11.

Як зазвичай, фрагменти коду можна знайти на GitHub.