Java: Générer des exécutables Windows, Linux et MacOS

Au profit d'un programme type "ligne de commande", avec Maven

Le 12/12/2022

Si comme moi tu en as assez de faire des programmes types “ligne de commande” en Java et d’être obligé de les lancer avec ce genre de choses :

$ java -jar demo-app-v1.0.0-SNAPSHOT.jar arg1 arg2 arg3`

Ce petit article devrait te plaire. Tu pourras alors faire directement ça :

$ ./demo-app arg1 arg2 arg3

Appétissant !

Dans ce petit tutoriel, je vais donc générer un exécutable :

  • pour Linux et MacOSX,
  • pour Windows, un .EXE,
  • sous forme de Runnable JAR, classique.

Cela nécessite toutefois la présence d’un Runtime JAVA (JRE et/ou JDK) sur la machine qui l’exécutera, bien qu’il existe aussi des solutions pour embarquer un JRE.

Les solutions, que je vais décrire, n’utilisent pas GRAALVM et sa compilation native.

Java: How to generate Windows, Linux and MacOS executables?

In favor of a "command line" type program, with Maven

Le 12/12/2022

If, like me, you are tired of making command line programs in Java and having to run them with this kind of things:

$ java -jar demo-app-v1.0.0-SNAPSHOT.jar arg1 arg2 arg3`

This little article should please you. You will then be able to do this directly:

$ ./demo-app arg1 arg2 arg3

Appetizing!

In this little tutorial, I will generate an executable file :

  • for Linux and MacOSX,
  • for Windows, an .EXE,
  • as a classic Runnable JAR.

However, this requires the presence of a JAVA Runtime (JRE and/or JDK) on the machine that will run it, although there are also solutions to embed a JRE.

The solutions I will describe do not use GRAALVM and its native compilation.

Atari ST : Routines YM avec le Timer A

Tutoriel en C et Assembleur pour jouer des chiptunes.

Le 09/06/2021

Je vous avais mis l’eau à la bouche, dans mon précédent article relatif aux interactions entre C et Assembleur, en annonçant que cela servirait à jouer de la musique sur le processeur audio de l’Atari ST, le YAMAHA-2149 (YM-2149) : nous y voilà !

Dans ce tutoriel, nous verrons :

  • quelques concepts fondamentaux sur la production de son depuis le YM-2149 ;
  • comment interagir en Assembleur et en C avec le YM-2149 ;
  • la structure des fichiers YM, principalement YM2! et YM3! ;
  • quelques notions théoriques sur les Timers de l’Atari ST ;
  • la diffusion du son, par interruption, au moyen d’une routine Timer A ;
  • et enfin quelques détails comme par exemple la lecture d’une touche spécifique du clavier.

Ce tutoriel mixera C et Assembleur en fonction des tâches à réaliser :

  • la lecture de fichier de musique ainsi que les affichages à l’écran se feront en C ;
  • la routine de lecture du son sera effectuée en Assembleur et déclenchée par le Timer A.

Cerise sur le gâteau, je vous proposerai quand même une implémentation complète exclusivement en C.

Vous pouvez récupérer l’ensemble du code source sur mon repository dédié sur github.

Accrochez-vous, c’est parti !

Rocket Launch

Atari ST : coopération C et Assembleur

Du code C qui appelle de code Assembleur et réciproquement

Le 02/06/2021

4 bitplanes de l'Atari ST

Structure de la mémoire vidéo en 320x200 de l'Atari ST

Le 12/04/2021

Quand on se (re)plonge dans la programmation de l’Atari ST et notamment de l’affichage des pixels à l’écran, on se rend vite compte qu’on a pris de bien mauvaises habitudes avec nos ordinateurs “modernes”, où la structure en mémoire est très simple en comparaison.

Cet article, illustré de programmes en C, va vous permettre de comprendre ENFIN cet agencement particulièrement étonnant pour ne pas dire étrange.

Retrouvez mon ami Fred, qui a délaissé un peu son Amiga pour venir du côté obscur de l’Atari ST, dans sa quête d’affichage de pixels !

Worst JAVA API collection of the World

Le 05/05/2020

Grrrraaaaarrrh !!!

Blanka lire tutorial horrible ici :

https://examples.javacodegeeks.com/java-tuple-example/

NDLR : je laisse le lien de Blanka, mais je vous en supplie de cliquez pas dessus !

API Java juste Horrible ! Blanka Très colère !

Humain étrange humain créer ça :

// Getting a value from a tuple and iterating it.
final Quartet<String, Integer, String, Double> quartet3 = Quartet.with("Abc", 30, "Pqr", 23000.5);

// Getting a value from the tuple.
System.out.println("Name= " + quartet3.getValue0());
System.out.println("Age= " + quartet3.getValue1());
System.out.println("Address= " + quartet3.getValue2());
System.out.println("Sal= " + quartet3.getValue3());

NDLR : je le redis, ne copier pas ce code, n’utilisez pas cette API !

BLAAAANKAAAA très grosse colère !

REST API avec Quarkus, JPA, PostGreSQL et GraalVM

réduire l'empreinte serveur d'une API REST en JAVA en la compilant en code natif !

Le 16/04/2020

Ce tutoriel Quarkus-JPA-PostgreSQL met en oeuvre :

  • une API Rest partielle (GET) avec JAX-RS et Quarkus sur une source de données JPA
  • des tests unitaires
  • des tests d’intégration au niveau API (http) avec un PostGreSQL lancé par un plugin maven Docker
  • une distribution native, compilée avec GraalVM et une image docker de l’application compilée

Réalisé sous Linux Mint 19 mais devrait convenir à de nombreuses distributions, voire à Windows.

Functional Switch/Case en Java 8 et +

parce que le nouveau Switch/Case de Java 12 m'a donné cette idée saugrenue

Le 26/02/2020

Java 12 est sorti le 20/03/19, apportant une nouvelle façon d’écrire des structures de contrôle switch/case. Cela m’a donné une idée, certes un peu étrange, de revoir le traditionnel switch/case d’un point de vue programmation fonctionnelle en s’appuyant sur des lambdas et une petite classe Switch, le tout en JAVA 8 !

Attention toutefois, il est certain que cette approche est beaucoup moins performante qu’un switch/case classique, mais je ne renonce pas à la beauté du geste.

Versions de cet article :

  • 04/10/2019 : première publication.
  • 26/02/2020 : suite à idée judicieuse postée sur les forums “developpez.com”, voir la partie “Let’s go further …”

Functional Switch/Case with Java 8+

because the new Switch/Case statement with Java 12 gave me a weird idea

Le 26/02/2020

Java 12 was released on 20/03/19, bringing a new way to write switch/case control structures. This gave me an idea, admittedly a bit strange, to revisit the traditional switch/case from a functional programming point of view by using lambdas and a small Switch class, all in JAVA 8!

Be careful though, it is certain that this approach is much less efficient than a classic switch/case, but I don’t give up the beauty of the gesture.

Versions of this article:

  • 04/10/2019: first publication.
  • 26/02/2020 : following a judicious idea posted on “developpez.com” forums, see the “Let’s go further …” part.

Repenser son style de codage

du code, pour qui, pourquoi ?

Le 30/08/2018

Cela fait des années que je place différemment mes accolades { }, à contre-courant de ce qui se fait généralement en Java, faisant ainsi ressembler mon code à du C/C++. Ce billet est l’occasion de faire une sorte d’introspection sur ma pratique : Est-elle bonne ? Est-elle désuète ? Pourquoi je n’aime pas le style SUN ? Est-ce que mon style est utile ou inutile ?

Que de questions auxquelles ce billet va tenter de répondre.

Le singleton est mort, vive le singleton !

Encore un post sur le Singleton ?

Le 06/08/2018
  • Version 1 parue le 16/12/2017
  • Version 2 parue le 06/08/2018 : accès concurrents, PermGen / Meta spaces, Holder interne

L’objectif de ce billet est de présenter une implémentation simple en Java du pattern Singleton.

Je ne traiterai donc pas de l’utilité ni des recommandations d’usage liées à celui-ci mais bien de mise en oeuvre (codage pour les intimes) en Java Standard Edition (JSE).

Float pour un Montant

Le 27/07/2018

Blanka très très très EN COLERREEEEEEE !

Blanka trouver encore trop de codes sources sur GitHub avec Float price; ou Double montantTotal;.

Gens pas connaitre IEEE-754 !!!!!

Blanka donner lien en anglais à lire par gens ! https://javarevisited.blogspot.com/2012/02/java-mistake-1-using-float-and-double.html

Blanka donner TL;DR : Gens devoir utiliser BigDecimal avec constructeur String !

Blanka prévenir : si Blanka trouver code source avec Float pour montant, Blanka casser Crâne !!!!!

GWT, AngularJS, GoogleMaps, Kotlin

Le 22/07/2018

Blanka pas aimer quand Google rien avoir à faire des développeurs. Google casser API, Google arrêter API, Google faire payer API quand Google dire gratuit.

Blanka lister Google bad-habits :

  • Google abandonner GWT -> Google créer GWT2
  • Google abandonner GWT2 -> Google créér AngularJS
  • Google abandonner AngularJS -> Google créer Angular2
  • Google donner GoogleMaps -> Google faire payer GoogleMaps
  • Google procès Java JVM -> Google encourager JavaScript (EcmaScript)
  • Google procès Java API -> Google encourager Kotlin

Web Components

Le 21/07/2018

Blanka pas content du tout quand Blanka obligé écrire JavaScript + CSS + HTML dans même fichier !

Blanka trouve programmation gros crado :

<script src="node_modules/@webcomponents/webcomponents-bundle.js"></script>
  <script type="module">
    import {LitElement, html} from '@polymer/lit-element';

    class MyElement extends LitElement {

      static get properties() { return { mood: String }}

      _render({mood}) {
        return html`<style> .mood { color: green; } </style>
          Web Components are <span class="mood">${mood}</span>!`;
      }

    }

    customElements.define('my-element', MyElement);
  </script>

  <my-element mood="happy"></my-element>

Découverte de Deltaspike Data Module

avec CDI 2.0, Weld 3, JUnit 5, JPA 2.2, EclipseLink 2.7, H2 et Lombok

Le 21/06/2018

Cet article va vous permettre de découvrir Deltaspike Data Module, une alternative à Spring Data dans le monde CDI et dans notre cas en CDI 2.0.

Cette accroche est parlante pour ceux qui connaissent Spring Data mais peut-être pas pour les autres : Deltaspike Data va permettre d’avoir très simplement une fonctionnalité de CRUD (Create, Read, Update, Delete) sur des entités JPA et bien plus encore en vous faisant économiser énormément de temps de développement et de bugs potentiels !

Préconditions des méthodes d'une API

Parce qu'il faudrait toujours vérifier les arguments

Le 02/06/2018

Comme tout système s’appuyant sur des inputs, il est très important de contrôler les arguments des méthodes quand on élabore une API, qu’elle soit locale sous forme de JAR ou distante via un service REST, afin de non seulement la rendre plus robuste et stable mais aussi de se prémunir de certaines attaques.

Cependant, en Java de base, c’est particulièrement laborieux, rébarbatif et cela engendre une fainéantise exacerbée. Conséquences directes et désastreuses : baisse de la qualité, de la robustesse du code et créations potentielles de failles de sécurité.

Cet article tente de faire le tour de la question, sans prétention, en ratissant assez large. C’est à dire en allant de Java classique jusqu’à Bean Validation et JAX-RS, en passant par une implémentation spécifique “Faite Maison”.

Serveur minimal HTTP avec JShell en Java_10

Histoire de troller sur NodeJS versus Java

Le 23/04/2018

NodeJS se targue de pouvoir monter en quelques lignes de code un simple serveur HTTP. Effectivement, créer ce genre de serveur est vraiment simple et particulièrement utile pour du déploiement dans le Cloud.

Et Java dans tout ça ? A la traîne ? Has-Been ?

“Si à 50 ans t’as pas de Rolex et/ou si tu sais pas faire de TypeScript, t’as raté ta vie !”

Fort heureusement, je vais vous montrer qu’avec JShell, apparu avec Java 9, en 10 lignes de code environ, vous obtiendrez un serveur HTTP Asynchrone, performant, en ayant à portée de main tout ce que vous offre Java 10, ses modules, ainsi qu’historiquement, toutes les bibliothèques JAR de son écosystème !

Apache Archiva sur Raspberry PI

pour centraliser ses artefacts et autres archetypes ...

Le 14/04/2018

Il me faut un repo Maven dédié !”. Voilà ce qui m’est venu en tête quand j’ai dû changer de machine récemment alors que tous les artefacts maven que je produisais étaient capitalisés dans le .m2/repository de mon home. Autant dire “Pas capitalisés”.

Bien sûr, j’utilise un repo Nexus au boulot mais je change d’activité et je vais devenir plus mobile, il me faut donc une solution.

J’aurais pu prendre une image Docker et la déployer sur AWS ou équivalent : la solution de facilité qui demande toutefois un peu de “ressource” financière.

Et je le vois, là, rose, toutes diodes allumées, connecté à ma box, servant de proxy Squid de temps en temps. Mon Raspberry PI 1, je l’entends encore me dire “Moi je peux, moi je peux, moi je peux !” en trépignant dans son joli boitier.

Contribuer à l'Eclipse Foundation : DONE

plutôt que d'attendre en pestant sur sa chaise ...

Le 02/04/2018

Comme tout bon développeur Java, je suis un gros consommateur des solutions fournies par l’Eclipse Foundation. Je ne vais en citer que quelques-unes : Eclipse IDE, EclipseLink, Eclipse GlassFish, Jetty, Eclipse EGit, Eclipse Maven Integration, etc.

Il était donc temps, au lieu d’attendre en ronchonnant qu’un patch ne soit développé, de contribuer en fournissant un correctif à un projet.

Xenon Reborn, développer en s'amusant et réciproquement

Ou comment apprendre à coder en réalisant un jeu vidéo ...

Le 14/03/2018

Dans mon parcours professionnel, j’ai été formateur de jeunes développeurs pendant sept années. Ces derniers venaient d’horizons différents, parfois sans aucune compétence en terme de programmation.

Afin de rendre ludique l’apprentissage des fondamentaux de l’algorithmique et de Java, je les ai fait participer à la création d’un jeu video : Xenon Reborn, inspiré du célèbre jeu Xenon des Bitmap Brothers.