Exécution de programmes mono-fichier sans compilation en Java 11 – Un bon serveur Minecraft
Sommaire
Points clés à retenir
- Cette fonctionnalité permet d'exécuter un code source Java à fichier unique directement, sans aucune compilation, en évitant les étapes fastidieuses qui impliquaient précédemment d'exécuter un simple programme hello world.
- Cette fonctionnalité est particulièrement utile pour les débutants dans la langue qui souhaitent essayer des programmes ou des fonctionnalités simples. lorsque vous combinez cette fonctionnalité avec jshell, vous obtenez un ensemble d’outils d’apprentissage pour débutants.
- Cette fonctionnalité vous permet également d'accéder à des niveaux avancés, où vous pouvez passer des paramètres de ligne de commande pour le contrôler, utiliser plus de classes et même ajouter des modules à l'application actuelle en une seule fois.
- En combinant cette fonctionnalité avec les fichiers Shebang (#!), Vous pouvez normalement exécuter Java en tant que script shell, lorsque vous exécutez votre script * nix bash à partir de la ligne de commande.
- Cet article explore les nouveaux programmes de code source à fichier unique Java 11+ Launch (JEP 330) et fournit des exemples basés sur JShell ainsi que des conseils et astuces sur l'utilisation correcte et incorrecte.
Pourquoi tu as besoin de ça
Si vous vous rappelez les vieux jours juste avant Java SE 11 (JDK 11), dis que tu as un HelloUniverse.java
fichier source contenant une définition de classe et une méthode principale statique qui s'imprime sous la forme d'une seule ligne de texte dans le terminal, comme suit:
Classe publique HelloUniverse
public static void main (String[] args)
System.out.println ("Hello InfoQ Universe");
Normalement, pour exécuter cette classe, vous devez d’abord la compiler à l’aide d’un compilateur Java (javac
), ce qui entraînerait une HelloUniverse.class
fichier:
mohamed_taman $ javac HelloUniverse.java
Ensuite, vous utiliseriez un Java
commande de la machine virtuelle (interprète) pour exécuter le fichier de classe résultant:
mohamed_taman $ java HelloUniverse
Bonjour Univers InfoQ
Cela démarre la machine virtuelle Java, charge la classe et exécute le code.
Mais que faire si vous voulez tester rapidement un morceau de code ou si vous débutez dans l’apprentissage de Java (qui est la clé ici) et que vous voulez expérimenter avec la langue? Ces deux étapes du processus peuvent sembler un peu lourdes.
Dans Java SE 11, vous avez la possibilité de lancer directement un fichier de code source unique, sans compilation intermédiaire.
Cette fonctionnalité est particulièrement utile pour les débutants dans la langue qui souhaitent essayer des programmes simples. lorsque vous combinez cette fonctionnalité avec jshell
, vous obtenez un ensemble d’outils d’apprentissage pour débutants.
Pour plus d'informations sur le nouveau Jshell 10+, s'il vous plaît vérifier mon cours vidéo "Travaux Pratiques sur Java 10 Programmer avec JShell ".
Les professionnels peuvent également utiliser ces outils pour explorer de nouveaux changements de langue ou pour essayer une API inconnue. À mon avis, une plus grande puissance vient lorsque nous pouvons automatiser de nombreuses tâches, telles que l'écriture de programmes Java sous forme de scripts, puis leur exécution à partir du shell du système d'exploitation. Cette combinaison nous donne la flexibilité des scripts shell mais avec la puissance du langage Java. Nous explorerons cela plus en détail dans la seconde moitié de l'article.
Cette fonctionnalité intéressante de Java 11 vous permet d’exécuter un code source Java à fichier unique directement sans aucune compilation. Passons maintenant à plus de détails et à des sujets intéressants.
Ce que vous devrez suivre
Pour exécuter toutes les démonstrations fournies dans cet article, vous devez utiliser une version récente de Java. Ce devrait être Java 11 ou plus tard. La version actuelle est Kit de développement Java SE 12.0.1 – la version finale est disponible à partir de ce lien, acceptez simplement la licence et cliquez sur le lien correspondant à votre système d'exploitation. Si vous souhaitez explorer des fonctionnalités plus récentes, la dernière JDK 13 accès anticipé est la plus récente, et vous pouvez le télécharger à partir de ce lien.
Vous devez également noter que les versions d'OpenJDK sont désormais également disponibles auprès d'Oracle, ainsi que d'autres fournisseurs, y compris AdoptOpenJDK.
Dans cet article, nous utilisons un éditeur de texte brut plutôt qu'un IDE Java, car nous souhaitons éviter toute magie de l'IDE et utiliser la ligne de commande Java directement dans le terminal.
Exécuter .java avec Java
JEP 330, Lancer des programmes à code source à fichier unique, est l’une des nouvelles fonctionnalités introduites dans la version 11 de JDK. Cette fonctionnalité vous permet d’exécuter un fichier de code source Java directement à l’aide du Java
interprète. Le code source est compilé en mémoire puis exécuté par l'interpréteur, sans produire de fichier .class sur le disque.
Cependant, cette fonctionnalité est limitée au code qui réside dans un seul fichier source. Vous ne pouvez pas ajouter de fichiers source supplémentaires à compiler lors de la même exécution.
Pour contourner cette limitation, toutes les classes doivent être définies dans le même fichier, mais il n'y a aucune restriction quant au nombre de classes dans le fichier, qu'elles soient toutes des classes publiques ou non, cela n'a pas d'importance tant qu'elles sont dans le même fichier source.
La première classe déclarée dans le fichier source sera récupérée pour être utilisée comme classe principale, et nous devrions placer notre méthode principale dans cette classe. Donc, l'ordre compte.
Un premier exemple
Commençons maintenant comme nous le faisons chaque fois que nous commençons à apprendre quelque chose de nouveau – oui, exactement comme vous l’avez deviné – avec l’exemple le plus simple: Hello Universe!
Nous concentrerons nos efforts sur la démonstration de l’utilisation de cette fonctionnalité en essayant différents échantillons afin que vous ayez une idée de la façon dont elle peut être utilisée dans le codage quotidien.
Si ce n’est pas déjà le cas, créez le HelloUniverse.java
comme indiqué en haut de l'article, compilez-le et exécutez le fichier de classe obtenu.
Maintenant, je veux que vous supprimiez le fichier de classe; vous comprendrez pourquoi dans un instant:
mohamed_taman $ rm HelloUniverse.class
Maintenant, si vous exécutez la classe uniquement avec l'interpréteur Java, sans compilation, comme dans:
mohamed_taman $ java HelloUniverse.java
Bonjour Univers InfoQ
Vous devriez voir le même résultat qu'auparavant – il fonctionne.
Cela signifie que nous pouvons maintenant simplement dire java HelloUniverse.java
. Nous ne faisons que transmettre le code source plutôt que le fichier de classe: il compile le code source en interne, puis exécute le code compilé obtenu et, finalement, le message est envoyé à la console.
Donc, il y a toujours un processus de compilation en cours et s'il y a une erreur de compilation, vous aurez toujours une notification d'erreur. En outre, vous pouvez vérifier la structure des répertoires et constater qu’aucun fichier de classe n’est généré; c'est un processus de compilation en mémoire.
Voyons maintenant comment cette magie se produit.
Comment l'interpréteur Java exécute le programme HelloUniverse
A partir de JDK 10, le lanceur Java fonctionne selon trois modes:
- Exécuter un fichier de classe
- Exécution de la classe principale d'un fichier JAR
- Exécuter la classe principale d'un module
Maintenant en Java 11, un nouveau quatrième mode a été ajouté
- Exécuter une classe déclarée dans un fichier source.
En mode de fichier source, l’effet est comme si le fichier source était compilé en mémoire et que la première classe trouvée dans le fichier source était exécutée.
La décision de passer en mode de fichier source est déterminée par deux éléments de la ligne de commande:
- Le premier élément de la ligne de commande qui n'est ni une option ni une partie d'une option.
- le
--la source
<version
> option, si présente.
Dans le premier cas, la commande Java examinera le premier élément de la ligne de commande qui n'est ni une option ni une partie d'une option. S'il s'agit d'un nom de fichier qui se termine par .java, il sera traité comme un fichier source Java à compiler et à exécuter. Vous pouvez toujours fournir des options à la commande Java avant le nom du fichier source. Par exemple, si vous souhaitez définir un chemin d'accès aux classes lorsque le fichier source utilise des dépendances externes.
Dans le second cas, le mode de fichier source est sélectionné et le premier élément de ligne de commande non-option sera traité comme un fichier source à compiler et à exécuter.
Si le fichier n'a pas le .Java
extension, la --la source
Cette option doit être utilisée pour forcer le mode fichier source.
Ceci est nécessaire pour les cas où le fichier source est un "scénario"à exécuter et le nom du fichier source ne suit pas les conventions de dénomination normales pour les fichiers source Java.
le --la source
Cette option peut être utilisée pour spécifier la version linguistique du code source. Je parlerai plus à ce sujet plus tard.
Pouvons-nous passer des arguments en ligne de commande?
Améliorons le programme Hello Universe pour créer un message d'accueil personnalisé pour toute personne visitant l'univers InfoQ:
Classe publique HelloUniverse2
public static void main (String[] args)
if (args == null
Sauvegardons le code dans un fichier nommé Greater.java
. Notez que le nom du fichier ne correspond pas à celui de la classe publique qui enfreint les règles de la spécification du langage Java.
Exécutez ce code et voyez ce qui va arriver:
mohamed_taman $ java Greater.java "Mo. Taman"
Bonjour, Mo. Taman dans l'univers InfoQ !!
Comme vous pouvez le constater, peu importe que le nom de la classe corresponde au nom du fichier; il est compilé en mémoire et il n'y a pas .classe
fichier généré. Les lecteurs aux yeux d'aigle ont peut-être aussi remarqué comment nous avons passé des arguments au code après le nom du fichier à exécuter. Cela signifie que tous les arguments apparaissant sur la ligne de commande après le nom du fichier sont passés à la commande standard. principale
méthode de cette manière évidente.
Spécifiez le niveau de votre fichier de code avec l'option –source
Il existe deux scénarios qui utilisent le --la source
option:
- Spécifiez le niveau source de votre fichier de code
- Forcer le runtime Java en mode d'exécution source
Dans le premier cas, lorsque vous omettez le niveau source, il est supposé être la version actuelle du JDK. Dans le second cas, vous pouvez transmettre des noms de fichiers avec des extensions autres que .java à compiler et à exécuter à la volée.
Examinons d’abord le deuxième scénario et renommons Greater.java
pour juste plus grand
sans aucune extension et essayez de l'exécuter à nouveau en utilisant la même approche:
mohamed_taman $ java plus grand "Mo. Taman"
Erreur: impossible de trouver ou de charger la classe principale supérieure
Causé par: java.lang.ClassNotFoundException: une plus grande
Comme vous le voyez, en l'absence d'un .Java
extension, l’interpréteur de commandes Java recherche une classe compilée sous le nom fourni en tant qu’argument – mode 1 du lanceur de java. Pour éviter cela, nous devons utiliser le --la source
option pour forcer le mode fichier source:
mohamed_taman $ java - source 11 plus grande "Mo. Taman"
Bonjour, Mo. Taman dans l'univers InfoQ !!
Revenons maintenant au premier scénario. le Greater.java
La classe est compatible avec JDK 10 car elle contient var mot-clé, mais n'est pas compatible avec JDK 9. Changez le source en 10 et voyez ce qui se passera:
mohamed_taman $ java - source 10 Greater.java "Mo. Taman"
Bonjour Mo. Taman dans l'univers InfoQ !!
Maintenant, exécutez à nouveau la commande précédente, mais passez à la --la source
option JDK 9 au lieu de JDK 10:
mohamed_taman $ java --source 9 Greater.java "Mo. Taman"
Greater.java:8: warning: à partir de la version 10, 'var' est un type de variable locale restreint et ne peut pas être utilisé pour les déclarations de type ou comme type d'élément d'un tableau.
var name = args[0];
^
Greater.java:8: error: impossible de trouver le symbole
var name = args[0];
^
symbole: classe var
emplacement: classe HelloWorld
1 erreur
1 avertissement
erreur: la compilation a échoué
Notez la forme du message d'erreur – le compilateur vous avertit que la variable devient un nom de type restreint dans JDK 10, mais comme il s'agit du niveau de langue 9, la compilation continue. Toutefois, la tentative de compilation échoue, car un type appelé var est introuvable dans le fichier source.
Assez simple, non? Voyons maintenant comment utiliser plusieurs classes.
Est-ce que ça fonctionne avec plusieurs classes?
La réponse est oui.
Examinons un exemple de code contenant deux classes pour démontrer que la fonctionnalité fonctionne avec plusieurs classes. Le code vérifie si une chaîne donnée est un palindrome ou non. Un palindrome est un mot, une phrase, un nombre ou une autre séquence de caractères qui lit la même chose dans les deux sens, tel que "redivider " ou "reviver ".
Voici le code sauvegardé dans un fichier nommé PalindromeChecker.java
:
importer statique java.lang.System. *;
Classe publique PalindromeChecker
public static void main (String[] args)
Classe publique StringUtils
public statique Boolean isPalindrome (Mot de chaîne)
return (nouveau StringBuilder (word))
.sens inverse()
.toString ()
.equalsIgnoreCase (word);
Maintenant, exécutons le fichier:
mohamed_taman: code $ java PalindromeChecker.java RediVidEr
La chaîne RediVidEr est un palindrome !! Vrai
Recommençons en remplaçant "MadAm" par "RaceCar":
mohamed_taman: code $ java PalindromeChecker.java RaceCar
La chaîne RaceCar est un palindrome !! Vrai
Enfin, essayons "Mohamed" à la place de "RaceCar":
mohamed_taman: code $ java PalindromeChecker.java Taman
La chaîne Taman est un palindrome !! faux
Comme vous pouvez le constater, vous pouvez ajouter autant de classes publiques que nécessaire dans un seul fichier source. La seule chose qui compte est que la méthode principale soit définie dans la première classe du fichier source. L'interpréteur (commande Java) utilisera la première classe comme point d'entrée pour lancer le programme après la compilation du code en mémoire.
Les modules sont-ils autorisés?
Oui, l'utilisation de modules est entièrement autorisée. Le code compilé en mémoire s’exécute dans le cadre d’un module sans nom avec l’option --add-modules = ALL-DEFAULT
qui donne accès à l’ensemble des modules fournis avec le JDK.
Cela permet au code d'utiliser différents modules sans avoir à déclarer explicitement la dépendance à l'aide de module-info.java.
Examinons un code appelant HTTP à l’aide de la nouvelle API client HTTP fournie avec JDK 11. Notez que ces API ont été introduites dans Java SE 9 en tant que fonctionnalité d’incubateur, mais qu’elles sont maintenant devenues une fonctionnalité complète du java.net.http
module.
Dans cet exemple, nous allons appeler une API REST simple via une méthode GET pour obtenir certains utilisateurs. Nous appellerons un service public d'extrémité https://reqres.in/api/users?page=2
. L'exemple de code est dans un fichier avec le nom UtilisateursHttpClient.java
:
importer statique java.lang.System. *;
importer java.net.http. *;
importer java.net.http.HttpResponse.BodyHandlers;
importer java.net. *;
importer java.io.IOException;
Classe publique UsersHttpClient
public static void main (String[] args) jette Exception
var client = HttpClient.newBuilder (). build ();
var request = HttpRequest.newBuilder ()
.OBTENIR()
.uri (URI.create ("https://reqres.in/api/users?page=2"))
.construire();
var réponse = client.send (requête, BodyHandlers.ofString ());
out.printf ("Le code de réponse est:% d% n", response.statusCode ());
out.printf ("Le corps de la réponse est:% n% s% n", response.body ());
L'exécution du programme aboutit au résultat suivant:
mohamed_taman: code $ java UsersHttpClient.java
Le code de réponse est: 200
Le corps de la réponse est:
"page": 2, "per_page": 3, "total": 12, "total_pages": 4, "données":["id":4,"first_name":"Eve","last_name":"Holt","avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/128.jpg","id":5,"first_name":"Charles","last_name":"Morris","avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/stephenmoon/128.jpg","id":6,"first_name":"Tracey","last_name":"Ramos","avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/bigmancho/128.jpg"]
Cela vous permet de tester rapidement les nouvelles fonctionnalités fournies par différents modules sans avoir à créer votre propre module.
Pour plus d'informations sur le nouveau système de module de plate-forme Java (JPMS), consultez mon cours vidéo "Mise en route de Clean Code Java SE 9".
Pourquoi les scripts sont-ils importants pour Java?
Tout d’abord, rappelons-nous ce que sont les scripts, afin de comprendre pourquoi il est important de les disposer dans le langage de programmation Java.
Nous pouvons définir le script comme suit:
"Un script est un programme écrit pour une application spécifique. environnement d'exécution qui automatise l'exécution de tâches ou de commandes pouvant également être exécutées une par une par un humain. "
De cette définition générique, nous pouvons dériver une définition simple pour un langage de script; Un langage de script est un langage de programmation qui utilise une construction de haut niveau pour interpréter et exécuter une ou plusieurs commandes à la fois.
Un langage de script est un langage de programmation qui utilise une série de commandes dans un fichier. En règle générale, les langages de script sont souvent interprété (plutôt que compilé), et tendent vers le style procédural de la programmation (bien que certains langages de script aient aussi des fonctionnalités orientées objet)
En général, les langages de script sont plus faciles à apprendre et plus rapides à coder que les langages compilés et structurés tels que Java, C, et C ++. Des exemples de langages de script côté serveur, notamment Perl, PHP et Python, ainsi que sur côté client JavaScript.
Pendant longtemps, Java a été classé comme langage compilé bien structuré, fortement typé, interprété par la machine virtuelle Java pour s’appliquer à n’importe quelle architecture informatique. Cependant, une plainte à propos de Java est qu’il n’est pas aussi rapide d’apprendre ou de prototyper par rapport aux langages de script courants.
Cependant, Java est maintenant un langage vieux de 24 ans et est utilisé par environ 9,4 millions de développeurs dans le monde entier. Pour faciliter l’apprentissage de Java et l’essai de ses fonctionnalités et de ses API sans pour autant nécessiter la compilation et les IDE, les jeunes générations de programmeurs ont ajouté plusieurs fonctionnalités dans les dernières versions. À partir de Java SE 9 a JShell (REPL) Un outil prenant en charge la programmation interactive a été ajouté afin de faciliter la programmation et l’apprentissage de Java.
Maintenant, avec JDK 11, Java est en train de devenir un langage de programmation capable de prendre en charge les scripts, car vous pouvez exécuter votre code simplement en invoquant le Java
commander!
Il existe deux méthodes de base pour créer des scripts dans Java 11:
- En utilisant le
Java
outil de commande directement. - En utilisant *rien scripts de ligne de commande – similaires à un script bash.
Nous avons déjà exploré la première option. Il est donc temps d’examiner la deuxième option, une fonctionnalité qui ouvre la porte à de nombreuses possibilités.
Fichiers Shebang: exécutez Java en tant que script shell.
Comme indiqué précédemment, Java SE 11 prend en charge les scripts, notamment les fichiers shebang traditionnels * nix. Aucun changement à la JLS (Java Language Sspécification) sont nécessaires pour prendre en charge cette fonctionnalité.
Dans un fichier shebang général, les deux premiers octets doivent être 0x23 et 0x21, qui est le codage ASCII des deux caractères "#! ". Tous les octets suivants du fichier sont alors lus avec le codage de caractères par défaut de la plate-forme en vigueur.
Par conséquent, un début de première ligne #! est seulement requis si vous souhaitez exécuter le fichier avec le mécanisme shebang du système d'exploitation. Cela signifie qu'aucune première ligne spéciale n'est nécessaire lorsque le programme de lancement de Java est explicitement utilisé pour exécuter le code à partir d'un fichier source, comme dans le cas contraire. HelloUniverse.java
exemple ci-dessus.
Examinons le prochain exemple dans un Terminal fonctionnant sur macOS Mojave 10.14.5. Mais d’abord, nous devrions définir quelques règles importantes à suivre lors de la création d’un fichier shebang:
- Ne pas mélanger Code Java avec le langage de script shell de votre système d'exploitation.
- Si vous devez inclure VM (Machine virtuelle), vous devez spécifier le
--la source
comme première option après le nom de l'exécutable dans le fichier shebang. Ces options comprennent:--class-path, --module-path, --add-exports, --add-modules, --limit-modules, --patch-module, --upgrade-module-path
, et toutes les variantes de ces options. Il pourrait également inclure la nouvelle option –enable-preview, décrite dans le PEC 12. - Toi doit spécifiez la version du langage Java utilisé pour le code source dans le fichier.
- Les personnages de shebang (#!) doit être la première ligne du fichier et doit ressembler à ceci:
#! / path / to / java --source
- L'utilisation de la mécanisme de shebang exécuter des fichiers conformes à la convention de dénomination standard (fichiers se terminant par
.Java
) pour les fichiers source Java est INTERDIT. - Enfin, vous devez marquer le fichier comme exécutable en utilisant:
chmod + x
. .
Pour notre exemple, créons un fichier shebang (programme utilitaire de script
) qui listera le contenu d'un répertoire dont le nom est passé en paramètre. Si aucun paramètre n'est passé, le répertoire actuel sera répertorié par défaut.
#! / usr / bin / java --source 11
importer java.nio.file. *;
importer statique java.lang.System. *;
Classe publique DirectoryLister
public static void main (String[] args) jette Exception
vardirName = ".";
if (args == null
Enregistrez ce code dans un fichier nommé dirlist
sans aucune extension et ensuite le marquer comme exécutable:
mohamed_taman: code $ chmod + x dirlist
Exécutez-le comme suit:
mohamed_taman: code $ ./dirlist
Va lister le répertoire courant
.
./PalindromeChecker.java
./plus grand
./UsersHttpClient.java
./HelloWorld.java
./Greater.java
./dirlist
Exécutez-le à nouveau avec la commande suivante en passant le répertoire parent et vérifiez vous-même le résultat.
mohamed_taman: code $ ./dirlist ../
Remarque: la ligne shebang (la première ligne) est ignorée par l'interpréteur lors de l'évaluation du code source. Par conséquent, un fichier shebang peut également être appelé explicitement par le programme de lancement, éventuellement avec les options supplémentaires suivantes:
$ java -Dtrace = true --source 11 dirlist
En outre, il convient de noter que, si le fichier de script se trouve dans le répertoire en cours, vous pouvez l'exécuter comme suit:
$ ./firlist
Ou, si le script est dans un répertoire du chemin PATH de l'utilisateur, vous pouvez l'exécuter comme suit:
$ dirlist
Enfin, fermons-nous en montrant quelques conseils et astuces à prendre en compte lors de l’utilisation de cette fonctionnalité.
Trucs et astuces
- Certaines options que vous pouvez passer à
javac
ne peut pas être transmis (ni reconnu d'ailleurs) par l'outil Java, tel que-processeur
ou-Werror
Les options. - Si les fichiers .class et .java existent dans le chemin de classe, le programme de lancement vous oblige à utiliser le fichier de classe.
mohamed_taman: code $ javac HelloUniverse.java
mohamed_taman: code $ java HelloUniverse.java
erreur: classe trouvée sur le chemin d'accès aux classes de l'application: HelloUniverse
-
Gardez à l'esprit la possibilité de conflits de noms de classes et de packages. Regardez la structure de répertoire suivante:
mohamed_taman: code $ tree . ├── Greater.java ├── Bonjour l'Univers ├── java.class └── java.java ├── HelloUniverse.java ├── PalindromeChecker.java ├── UsersHttpClient.java ├── dirlist └── plus grand
Remarquez les deux fichiers
java.java
sous le paquet HelloUniverse et le fichierHelloUniverse.java
dans le répertoire en cours. Que se passe-t-il lorsque vous essayez de courir:mohamed_taman: code $ java HelloUniverse.java
Quel fichier sera exécuté, le premier ou le second? le
Java
lanceur ne fait plus référence au fichier de classe dans leBonjour l'Univers
paquet. Au lieu de cela, il va charger et exécuter leHelloUniverse.java
fichier à partir de la source, de sorte que le fichier du répertoire en cours s’exécute.
J'aime utiliser cette fonctionnalité shebang car elle ouvre un monde de possibilités pour créer des scripts permettant d'automatiser beaucoup de travail en utilisant la puissance du langage Java.
Sommaire
À partir de Java SE 11 et pour la première fois dans l’historique du langage de programmation, vous pouvez exécuter un script contenant du code Java directement sans compilation. La fonctionnalité d’exécution de source Java 11 permet d’écrire des scripts en Java et de les exécuter directement à partir du fichier *.inx ligne de commande.
Commencez dès aujourd'hui à expérimenter avec cette nouvelle fonctionnalité et à coder avec plaisir. Merci de dire merci en passant le mot, juste pour le partager avec vos collègues geeks.
Ressources
A propos de l'auteur
Mohamed Taman est Sr. Enterprise Architect @DevTech doo, champion de Java, ambassadeur Oracle Groundbreaker, adopte Java SE.next (), JakartaEE.next (), membre de JCP, membre du comité exécutif de JCP, JSR 354, 363 & 373 Expert Group membre, dirigeant d'EGJUG, membre du conseil du club Oracle Egypt Architects, parle Java, love Mobile, Big Data, Cloud, Blockchain, DevOps. Conférencier international, auteur de livres et de vidéos sur "JavaFX essentials", "Initiation à Clean Code, Java SE 9" et "Programmation pratique Java 10 avec JShell", ainsi qu'un nouveau livre "Secrets of a Java Champions", A remporté le choix de Duke en 2015, en 2014 et les récompenses JCP pour les participants au programme d'adoption d'un pot exceptionnels adoptées en 2013.
Commentaires
Laisser un commentaire