Howto Java
- Documentation JAVA : https://docs.oracle.com/javase/
- Documentation OpenJDK : http://openjdk.java.net/
Installation
Sous Debian 7 et 8, c’est la version 7 d’OpenJDK que l’on installe :
# apt install openjdk-7-jre-headless
Sous Debian 9, on installe la version 8 :
# apt install openjdk-8-jre-headless
OpenJDK 8 sous Debian 8
On peut vouloir installer OpenJDK 8 sous Debian Jessie, on utilisera alors les backports :
# echo "deb http://archive.debian.org/debian jessie-backports main " >> /etc/apt/sources.list.d/backports.list
# apt install openjdk-8-jre-headless/jessie-backports
# update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
Oracle Java 8 sous Debian 7 / 8 et 9
Le plus simple est de créer un package automatiquement en utilisant le tar.gz du site oracle.
1- Tout d’abord il faut ajouter le dépôt contrib dans /etc/apt/sources.list :
deb http://mirror.evolix.org/debian stretch main contrib
2- Mettre à jour les dépôts et installer le paquet java-package
apt update && apt install java-package
Sur Debian 7, il faut installer java-package depuis les backports, car il y a un bug avec la version de wheezy ici
3- Il faut télécharger l’archive .tar.gz depuis le site d’Oracle, et utiliser la commande make-jpkg pour créer le paquet Debian :
Pour télécharger l’archive en acceptant les conditions d’Oracle, on peut utilisé ces options avec wget :
wget --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie"
**IMPORTANT: A ne pas exécuter en root, mais avec son utilisateur.**
$ make-jpkg jdk-8u51-linux-x64.tar.gz
Pour faire le build du paquet Debian, le TMPDIR par défaut est /tmp/, il faut donc que la partition /tmp/ soit en exec ou s’il y a pas assez de place dans /tmp on peut spécifier un TMPDIR différent, par exemple dans son /home/ :
$ TMPDIR=/home/utilisateur/ make-jpkg jre-8u144-linux-x64.tar.gz
4- On peut ensuite installer le paquet Debian généré :
# dpkg -i oracle-java8-jdk_8u51_amd64.deb
Sécurité
Importer un certificat racine
Java stocke ces certificats dans un fichier, situé dans /etc/ssl/certs/java/cacerts (sous Debian).
Pour lister les certificats :
$ keytool -list -v -keystore /etc/ssl/certs/java/cacerts
Pour importer un nouveau certificat, on peut utiliser la commande keytool :
$ keytool -import -v -file certificat.cer -alias <mykey> -keystore /etc/ssl/certs/java/cacerts
Il est ensuite demandé un mot de passe pour ouvrir la base de données des certificats. Par défaut, il s’agit de changeit.
Si vous ne précisez pas d’alias vous pourriez rencontrer l’erreur suivante :
keytool error: java.lang.Exception: Certificate not imported, alias <mykey> already exists
Basiquement, cela peut vouloir dire que le certificat a déjà été importé avec l’alias par défaut: mykey, il faudra donc trouver un autre nom pour importer le certificat.
Pour supprimer un certificat (parce qu’il est expiré par exemple) :
$ keytool -delete -keystore /etc/ssl/certs/java/cacerts -alias <mykey>
Java Cryptography Extension (JCE)
http://gcolpart.evolix.net/blog21/jce-non-limitees-sous-debian/
Sous squeeze :
Télécharger le fichier ici : http://download.oracle.com/otn-pub/java/jce_policy/6/jce_policy-6.zip
# dpkg-divert --add --rename --divert /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/US_export_policy.jar.debianorig /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/US_export_policy.jar
# dpkg-divert --add --rename --divert /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/local_policy.jar.debianorig /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/local_policy.jar
- (Télécharger sur votre poste) sur le site d'oracle : <http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html> | scp sur le serveur
# cd /home/$USER
# unzip jce_policy-6.zip
# cp jce/US_export_policy.jar /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/
# cp jce/local_policy.jar /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/
# chmod 644 /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/*.jar
Il faut aussi modifier
/etc/java-6-sun/security/java.security
, en mettant les
lignes suivantes après
# List of providers and their preference orders (see above):
security.provider.1=org.jasypt.hibernate.type.EncryptedStringType
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC
security.provider.9=sun.security.provider.Sun
Sous Wheezy avec JRE Oracle (pas OpenJDK) :
Télécharger le fichier ici : http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
# cd /home/$USER
# unzip UnlimitedJCEPolicyJDK7.zip
# cp UnlimitedJCEPolicy/US_export_policy.jar /usr/local/opt/jdk1.7.0_45/jre/lib/security/
# cp UnlimitedJCEPolicy/local_policy.jar /usr/local/opt/jdk1.7.0_45/jre/lib/security/
# chmod 644 /usr/local/opt/jdk1.7.0_45/jre/lib/security/*.jar
Il faut aussi modifier
/usr/local/opt/jdk1.7.0_45/jre/lib/security/java.security
,
en mettant les lignes suivantes après
# List of providers and their preference orders (see above):
security.provider.1=org.jasypt.hibernate.type.EncryptedStringType
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC
security.provider.9=sun.security.provider.Sun
Gestion de la mémoire
Le « tas » (heap), est l’emplacement mémoire où la machine virtuelle Java stocke les objets des applications.
Ce sont les options -Xms
et -Xmx
de la
Machine Virtuelle Java (JVM) qui permettent de définir la taille du tas.
Oracle recommande que les deux valeurs soient égales, afin de réduire le
travail du ramasse-miettes (source).
Par exemple :
# java -Xms 512m -Xmx 512m
# java -Xms 1g -Xmx 1g
Il est important de préciser ces options. Sinon, la valeur par défaut est définie à 25% de la mémoire disponible, ou 50% s’il reste moins de 2 Go disponibles (source).
Si la taille du tas n’est pas suffisante pour allouer un nouvel
objet, la JVM lance alors l’exception OutOfMemoryError
. Si
les applications Java consomment toute la mémoire d’un serveur, c’est
qu’il est sous-dimensionné par rapport au besoin.
Applications courantes :
- ElasticSearch : dans
/etc/elasticsearch/jvm.options
, un paramètre par ligne,-Xms 1g
et-Xmx 1g
. - Tomcat : HowtoTomcat#installation-et-configuration-dune-instance,
options
-Xms 1g -Xmx 1g
dans la variableJAVA_OPTS
.