Codice sorgente di file singolo Java 11

1. Introduzione

JDK 11, che è l'implementazione di Java SE 11, rilasciato a settembre 2018.

In questo tutorial, tratteremo la nuova funzionalità di Java 11 per l'avvio di programmi con codice sorgente a file singolo.

2. Prima di Java 11

Un programma a file singolo è quello in cui il programma si inserisce in un unico file sorgente.

Prima di Java 11, anche per un programma a file singolo, dovevamo seguire un processo in due fasi per eseguire il programma.

Ad esempio, se un file chiamato HelloWorld.java contiene una classe chiamata HelloWorld con un metodo main () , dovremmo prima compilarlo:

$ javac HelloWorld.java

Questo genererebbe un file di classe che dovremmo eseguire utilizzando il comando:

$ java HelloWorld Hello Java 11!

Tali programmi sono standard nelle prime fasi dell'apprendimento di Java o durante la scrittura di piccoli programmi di utilità. In questo contesto, è un po 'cerimoniale dover compilare il programma prima di eseguirlo.

Ma non sarebbe bello avere invece un processo in un'unica fase? Java 11 cerca di risolvere questo problema, consentendoci di eseguire tali programmi direttamente dalla sorgente.

3. Avvio di programmi con codice sorgente a file singolo

A partire da Java 11, possiamo utilizzare il seguente comando per eseguire un programma a file singolo:

$ java HelloWorld.java Hello Java 11!

Notare come abbiamo passato il nome del file del codice sorgente Java e non la classe Java al comando java .

La JVM compila il file sorgente in memoria e quindi esegue il primo metodo public main () che trova.

Otterremo errori di compilazione se il file sorgente contiene errori, ma altrimenti verrà eseguito come se lo avessimo già compilato.

4. Opzioni della riga di comando

Il programma di avvio Java ha introdotto una nuova modalità file di origine per supportare questa funzione. La modalità file di origine è abilitata se si verifica una delle due condizioni seguenti:

  1. Il primo elemento sulla riga di comando seguito dalle opzioni JVM è un nome file con estensione .java
  2. La riga di comando contiene l' opzione –source version

Se il file non segue le convenzioni di denominazione standard per i file di origine Java, è necessario utilizzare l' opzione –source . Parleremo di più di questi file nella prossima sezione.

Qualsiasi argomento posto dopo il nome del file sorgente nella riga di comando originale viene passato alla classe compilata quando viene eseguito.

Ad esempio, abbiamo un file chiamato Addition.java che contiene una classe Addition . Questa classe contiene un metodo main () che calcola la somma dei suoi argomenti:

$ java Addition.java 1 2 3

Inoltre, possiamo passare opzioni come –class-path prima del nome del file:

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

Ora, otterremo un errore se c'è una classe sul classpath dell'applicazione con lo stesso nome della classe che stiamo eseguendo .

Ad esempio, diciamo che ad un certo punto durante lo sviluppo, abbiamo compilato il file presente nella nostra directory di lavoro corrente utilizzando javac :

$ javac HelloWorld.java

Ora abbiamo sia HelloWorld.java che HelloWorld.class presenti nella directory di lavoro corrente:

$ ls HelloWorld.class HelloWorld.java

Ma, se proviamo a utilizzare la modalità file sorgente, otterremo un errore:

$ java HelloWorld.java error: class found on application class path: HelloWorld

5. Shebang Files

È comune nei sistemi derivati ​​da Unix, come macOS e Linux, utilizzare il carattere "#!" direttiva per eseguire un file di script eseguibile.

Ad esempio, uno script di shell in genere inizia con:

#!/bin/sh

Possiamo quindi eseguire lo script:

$ ./some_script

Tali file sono chiamati "file shebang".

Ora possiamo eseguire programmi Java a file singolo utilizzando lo stesso meccanismo.

Se aggiungiamo quanto segue all'inizio di un file:

#!/path/to/java --source version

Ad esempio, aggiungiamo il codice seguente in un file denominato 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); } }

E contrassegna il file come eseguibile:

$ chmod +x add

Quindi, possiamo eseguire il file proprio come uno script:

$ ./add 1 2 3 6

Possiamo anche utilizzare esplicitamente il programma di avvio per richiamare il file shebang:

$ java --source 11 add 1 2 3 6

L' opzione –source è richiesta anche se è già presente nel file. Lo shebang nel file viene ignorato e viene trattato come un normale file java senza l' estensione .java .

Tuttavia , non possiamo trattare un file .java come un file shebang, anche se contiene uno shebang valido. Pertanto quanto segue risulterà in un errore:

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

Un'ultima cosa da notare sui file shebang è che la direttiva rende il file dipendente dalla piattaforma. Il file non sarà utilizzabile su piattaforme come Windows, che non lo supporta nativamente.

6. Conclusione

In questo articolo, abbiamo visto la nuova funzionalità del codice sorgente a file singolo introdotta in Java 11.

Come al solito, gli snippet di codice possono essere trovati su GitHub.