Code source de fichier unique Java 11

Code source de fichier unique Java 11

1. introduction

JDK 11, qui est l'implémentation de Java SE 11, publiée en septembre 2018.

Dans ce didacticiel, nous aborderons la nouvelle fonctionnalité Java 11 de lancement de programmes de code source à fichier unique.

2. Avant Java 11

Un programme à un seul fichier est celui où le programme s'insère dans un seul fichier source.

Avant Java 11, même pour un programme à fichier unique, nous devions suivre un processus en deux étapes pour exécuter le programme.

Par exemple, si un fichier appeléHelloWorld.java contient une classe appeléeHelloWorld avec une méthodemain(),we would have to first compile it:

$ javac HelloWorld.java

Cela générerait un fichier de classe quewe would have to run using the command:

$ java HelloWorld
Hello Java 11!

Ces programmes sont standard dans les premiers stades de l’apprentissage de Java ou lors de l’écriture de petits programmes utilitaires. Dans ce contexte, il est un peu cérémonieux de devoir compiler le programme avant de l'exécuter.

But, wouldn’t it be great to just have a one-step process instead? Java 11 essaie de résoudre ce problème en nous permettant d'exécuter de tels programmes directement à partir de la source.

3. Lancement de programmes de code source à fichier unique

À partir de Java 11, nous pouvons utiliser la commande suivante pour exécuter un programme mono-fichier:

$ java HelloWorld.java
Hello Java 11!

Remarquez comment nous avons passé le nom du fichier de code source Java et non la classe Java à la commandejava.

La machine virtuelle Java compile le fichier source en mémoire, puis exécute la première méthode publiquemain() qu'elle trouve.

Nous obtiendrons des erreurs de compilation si le fichier source contient des erreurs, mais sinon, il s'exécutera comme si nous l'avions déjà compilé.

4. Options de ligne de commande

Le lanceur Java a introduit un nouveausource-file mode pour prendre en charge cette fonctionnalité. Le mode de fichier source est activé si l'une des deux conditions suivantes est remplie:

  1. Le premier élément de la ligne de commande suivi des options JVM est un nom de fichier avec l'extension.java

  2. La ligne de commande contient l'option de version–source

If the file does not follow the standard naming conventions for Java source files, we need to use the –source option. Nous parlerons plus en détail de ces fichiers dans la section suivante.

LesAny arguments placed after the name du fichier source dans la ligne de commande d'origine sont passés à la classe compilée lors de son exécution.

Par exemple, nous avons un fichier appeléAddition.java qui contient une classeAddition. Cette classe contient une méthodemain() qui calcule la somme de ses arguments:

$ java Addition.java 1 2 3

De plus, nous pouvons passer des options comme–class-path avant le nom du fichier:

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

Maintenant,we’ll get an error if there is a class on the application classpath with the same name as the class we are executing.

Par exemple, disons qu'à un moment donné au cours du développement, nous avons compilé le fichier présent dans notre répertoire de travail actuel en utilisantjavac:

$ javac HelloWorld.java

Nous avons maintenant les deuxHelloWorld.java and HelloWorld.class présents dans le répertoire de travail actuel:

$ ls
HelloWorld.class  HelloWorld.java

Mais, si nous essayons d'utiliser le mode de fichier source, nous obtiendrons une erreur:

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

5. Fichiers Shebang

Il est courant dans les systèmes dérivés d'Unix, comme macOS et Linux, d'utiliser le "#!" directive pour exécuter un fichier de script exécutable.

Par exemple, un script shell commence généralement par:

#!/bin/sh

Nous pouvons alors exécuter le script:

$ ./some_script

Ces fichiers sont appelés "fichiers shebang".

Nous pouvons maintenant exécuter des programmes Java à fichier unique en utilisant ce même mécanisme.

Si nous ajoutons ce qui suit au début d'un fichier:

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

Par exemple, ajoutons le code suivant dans un fichier nommé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);
    }
}

Et marquez le fichier comme exécutable:

$ chmod +x add

Ensuite, nous pouvons exécuter le fichier comme un script:

$ ./add 1 2 3
6

Nous pouvons également utiliser explicitement le programme de lancement pour appeler le fichier shebang:

$ java --source 11 add 1 2 3
6

The –source option is required even if it’s already present in the file. Le shebang dans le fichier est ignoré et est traité comme un fichier java normal sans l'extension.java.

Cependant, we can’t treat a .java file as a shebang file, even if it contains a valid shebang. Ainsi, ce qui suit entraînera une erreur:

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

Une dernière chose à noter concernant les fichiers shebang est que la directive rend le fichier dépendant de la plate-forme. The file will not be usable on platforms like Windows, which does not natively support it.

6. Conclusion

Dans cet article, nous avons vu la nouvelle fonctionnalité de code source à fichier unique introduite dans Java 11.

Comme d'habitude, des extraits de code peuvent être trouvésover on GitHub.