Pour Chlouchloutte. Mais la comparaison n'est pas daté...
Après investigation, ton problème est dû à la cross-compilation entre deux versions du JDK.
Explications
Tu essaies de compiler des sources Java en syntaxe 8 pour qu'elles soient compilées dans un bytecode dont le format sera à destination d'une JRE 8.
Or, tu opères cette compilation depuis un JDK 10. Que se passe-t-il alors ?
Simplement que le compilateur t'avertie que la JRE 8 a une certaine API et que ton JDK 10 contient l'API 8 + toutes les classes qui ont été ajoutées dans Java 9 et 10. Ce faisant, si tu venais à utiliser une classe n'existant que dans Java 10, alors même si le bytecode que le compilateur produit à partir de tes sources est à destination de Java 8, tu ne pourras pas lancer ton programme et tu auras une ClassNotFoundException.
Le JDK 10 ne pouvant pas savoir quelles classes ne se trouvent que dans Java 10, il te demande un bootstrap classpath, c'est-à-dire un chemin vers le fichier rt.jar d'un JDK 8, afin de ne te permettre de n'utiliser que des classes de l'API de Java 8 dans ton code.
Ainsi, le JDK 10 n'utilisera plus son rt.jar à lui qui est trop récent, mais l'ancien.
Solution
Ajouter dans la configuration du maven-compiler-plugin l'option
Il faut aussi que la variable $JRE8_HOME soit définie dans ton OS.
Et voilà.
N.B : en ce qui concerne les modules de Java 9, c'était une fausse piste, mea maxima culpa !
Un post intéressant sur les annotations JetBrains pour exposer le contrat d'une méthode (cf. programmation par contrat, JML). Si ces annotations peuvent servir à du code Kotlin pour plus facilement recevoir des données provenant d'un code Java, alors je pense que cela peut être une excellente idée de les utiliser afin d'avoir un code Java qui soit Kotlin friendly.
Le lien vers la doc officielle.
Les différents types de memory leaks et les patterns de memory consumption pour les détecter et les identifier.
Une appli écrite en 4 fois en :
- Java
- Groovy
- Kotlin
- Scala
La comparaison du readme est très appréciée.
Je m'intéresse beaucoup à GraalVM, ceci d'autant plus que la licence de Java changera au 1er janvier 2019.
Ce faisant, j'ai déjà migré les projets de la boite vers Kotlin afin de nous dissocier du langage Java et quelques temps je pourrai aussi me séparer aussi de la JVM et donc d'Oracle.
Alors je sais bien que GraalVM provient des labos d'Oracle, mais la licence d'utilisation ne pourra pas nous rendre captif puisque GraalVM offre la possibilité de générer un exécutable natif d'une part, et que le compilateur se trouve déjà sous GitHub avec une licence de logiciel libre d'autre part.
L'autre option, c'est Rust, mais Kotlin est plus facile d'accès lorsque l'on vient du monde Java.
MySQL conseil d'utiliser le type DATETIME pour stocker des dates, mais côté JVM quel est le type de données à utiliser ? Je résume ici la réponse :
- java.sql.Date permet de stocker une date mais sans l'heure.
- java.sql.Time permet de stocker l'heure mais sans la date.
- java.sql.Timestamp permet de stocker les deux.
Donc le type qui se rapproche le plus de DATETIME c'est java.sql.Timestamp.
Edit : et côté MySQL, que se passe-t-il ?
MySQL dispose de quatre types pour stocker les données temporelles :
- DATE pour stocker une date mais sans l'heure.
- TIME pour stocker une heure mais sans la date.
- DATETIME pour stocker un timestamp allant de 1000-01-01 00:00:00.000000 à 9999-12-31 23:59:59.999999.
- TIMESTAMP pour stocker un timestamp au format UTC allant de 1970-01-01 00:00:01 UTC à 2038-01-19 03:14:07 UTC.
Donc côté base de données vous êtes dans deux cas de figure qui ont eux-mêmes des sous-cas :
- Soit votre SI est mono-timezone et dans ce cas là, DATETIME vous accorde une plage de données plus large.
- Soit votre SI est multi-timezone (comme chez mon client actuel) et dans ce cas là vous avez deux sous-cas :
- Soit vous gérez la timezone côté serveur (Kotlin / Rust par exemple) => DATETIME.
- Soit vous gérez la timezone côté base et vous lui passez uniquement des timestamp UTC => TIMEZONE.
Apparemment, Log4j2 utiliser l'API I/O asynchone de Java8 ce qui le rendrait plus rapide que logback. L'article dresse une comparaison de ces deux frameworks.
Edit : Une fois que la file asynchrone de log4j2 est pleine, ses performances se dégradent bien en dessous de celles de logback.
Du tuning s'impose alors, source Stack Overflow.
Comme vous avez pu le constater, je me documente un peu sur le tuning JVM / MySQL / Linux en ce moment.
L'idée étant de faire simplement des choses simples. Cette page est assez complète et couvre bien les spectres I/O, memory usages, garbage collector, OS.
Un PDF à lire lorsque l'on configure une base MySQL derrière un driver Java et HikariCP en pool de connexions.
Exécuter du :
- Maven dependency check
- Findbugs
- PMD
- Checkstyle
Et d'autre en un seul plugin préconfiguré... Doudou ?
Très bon article expliquant :
- La différence entre un type et une classe.
- La variance et la covariance.
- L'invariance et la contravariance.
Ce qui permet de comprendre le fonctionnement complet des génériques en Java et Kotlin, ainsi que les mots clefs in et out de Kotlin.
J'ai testé ce soir et ce fût un fail. Mais je recommancerai à partir de la première release. Je pense qu'une stack mixée entre Kotlin > bytecode > native peut devenir très intéressant. Et si on se rapproche des tailles d'occupation de la mémoire de Go pour des applications Java-like qui dispose de la même charge CPU, alors autant vous dire que je signe tout de suite !
Edit : j'ai retesté et GraalVM ne supporte pas les accents / espaces dans les chemins de fichiers (y compris celui où elle est installée). Bref ça marche bien et le gain en performance est miraculeux !
Pour Chlouchoutte. Toutes les petites annotations existantes en Kotlin et qui produisent un code Java-friendly. L'autre point intéressant de l'article est qu'il montre le code Java produit à partir du code Kotlin.
À partir de java 1.8u161 la limité est débloquée par défaut => Donc rien à faire.
Pour les versions antérieures et débloquer la limitation cryptographique des nouvelles JVM (à partir du JDK 1.8u151), il faut
Ouvrir le fichier $JRE_HOME/lib/security/java.security et y ajouter / modifier la ligne suivante :
crypto.policy=unlimited
Voici la liste des liens utiles :
- https://www.digitalocean.com/community/tutorials/java-keytool-essentials-working-with-java-keystores
- https://www.javacodegeeks.com/2014/07/java-keystore-tutorial.html
- https://www.certificat.fr/fr/a+propos+de+certificat.fr/support/manuels/java/serveur+web+bas%C3%A9+java/commandes+keytool/
- https://docs.oracle.com/cd/E19798-01/821-1841/gjrgy/index.html
- http://www.objis.com/formation-java/tutoriel-formation-securite-java-https-apache-tomcat-7.html
- https://api-geek.com/ssl/tuto-generer-vos-certificats-ssl-tomcat-keytool-t2066.html