Introduction à OpenJDK et IcedTea
IcedTea fournit un harnais de
construction pour le paquet OpenJDK, Oracle a ouvert le code de
l'environnement de développement Java. Afin de fournir un environnement
d'exécution complètement libre, similaire à la distribution fermée
d'Oracle, Le harnais de construction IcedTea devient également libre, et sans doute
des versions meilleures de JDK qui n'a pas été ouvert à ce jour.
OpenJDK est utilisé pour
développer des programmes Java et
fournit un environnement d'exécution complet pour lancer des
programmes Java.
Ce paquet est connu pour se construire correctement sur une
plateforme LFS-7.4.
Note
Le greffon du navigateur et l'implémentation webstart ont été
séparé en différent projet. Pour fournir une implémentation
complète, vous aurez besoin d'installer plus tard IcedTea-Web-1.4.
OpenJDK est du code GPL, cependant,il convient de préciser qu'il y
a eu une exception spéciale pour les projets non-libres d'utiliser
ces classes dans leurs produits propriétaires. De façon similaire à
la LGPL, qui autorise des programmes non-libre à lier des
bibliothèques fournit par des programmes libres, La GNU
General Public License, version 2, avec l'exception des chemins de
classe autorise des programmes tierces à utiliser des classes
fournit par des programmes libres sans l'obligation que le
programme tierce soit également libre. Comme avec la LGPL, toutes
les modifications faite dans des parties d'un programme libre d'une
application tierce,doit également être librement disponible.
Note
L'environnement de construction IcedTea inclu une très complète,
open source suite de tests appelée JTreg. JTreg est prévue pour tester le JDK
fraichement construit pour une compatibilité raisonnable avec le
JDK fermé d'Oracle. Cependant, pour qu'une implémentation
indépendante revendique la compatibilité, incluant le projet
sponsorisé par Oracle OpenJDK,
elle doit passer une suite de tests fermée JCK/TCK. Pas de revendication de
compatibilité, même une compatibilité partielle, peut être faite
sans passer une suite de tests approuvées.
Oracle fournit un accès libre communautaire, au cas par cas, à
des outils fermés pour assurer une compatibilité à 100% avec leur
JDK propriétaire. La version binaire fournit ici n'a pas été
testé avec
TCK. Toutes les versions qui seront construites en utilisant
les instructions données, ne pourront pas revendiquer d'être
compatible avec le JDK propriétaire, sans que l'utilisateur
demande, et réussissent les tests de compatibilités.
Avec cela en tête, les binaires produits en utilisant cette
méthode de construction sont régulièrement testé avec le TCK par
les membres listés sur le site au dessus. En supplément de la
licence communautaire, une licence pour l'éducation,
non-commerciale pour TCK peut être obtenue ici.
Source Information sur le paquet
Téléchargements supplémentaires
Correctifs requis
Jar requis
Dépendances de OpenJDK
Dépendances requises
Un binaire existant ( la section intitulée « About Java » ou
une version construite récente de ce paquet, apache-ant-1.9.2,
Certificate Authority
Certificates, cpio-2.11, Cups-1.6.3, GTK+-3.8.4, giflib-5.0.5, NSPR-4.10, PulseAudio-4.0, UnZip-6.0, Wget-1.14, which-2.20, Xorg Libraries et
Zip-3.0.
Notes utilisateur : http://wiki.linuxfromscratch.org/blfs/wiki/openjdk
Installation de OpenJDK
Note
La construction des sources de OpenJDK demande apache-ant-1.9.2. Vus aurez besoin de le
construire afin de satisfaire la dépendance circulaire, et
revenir à cette section pour continuer la construction de
OpenJDK.
Contrairement aux autres paquets dans BLFS, les sources de
OpenJDK sont distribuées dans de
multiples téléchargements. Depuis que le harnais de construction de
IcedTea doit être utilisé pour construire OpenJDK, commencez par extraire le paquet
IcedTea et allez dans le répertoire d'extraction.
La distribuion de IcedTea OpenJDK
demande que js.jar
(du paquet Rhino)
soit en place pour fournir une implémentation java-script pour le
JDK libre. Si vous n'avez pas installé le fichier js.jar, faite le
avec les commandes suivantes en tant qu'utilisateur root
:
unzip ../rhino1_7R3.zip &&
install -v -d -m755 /usr/share/java &&
install -v -m755 rhino1_7R3/*.jar /usr/share/java
Comme mentionné précédemment, OpenJDK est composé de plusieurs projets
individuels de la version propriétaire de JDK qui ont été relicencié en une licence
open-source. Si vous avez téléchargé précédemment pour les
composants individuels, mettez tous les composants individuels dans
l'arbre des sources avec les commandes suivantes
cp -v ../corba.tar.gz . &&
cp -v ../hotspot.tar.gz . &&
cp -v ../jaxp.tar.gz . &&
cp -v ../jaxws.tar.gz . &&
cp -v ../jdk.tar.gz . &&
cp -v ../langtools.tar.gz . &&
cp -v ../openjdk.tar.gz .
Appliquez un correctif pour générer un fichier cacerts valide en
utilisant le système de certificats CA:
patch -Np1 -i ../icedtea-2.4.1-add_cacerts-2.patch
Appliquez un correctif pour remplacer les chemins corrigés par des
plus appropriée pour BLFS:
patch -Np1 -i ../icedtea-2.4.1-fixed_paths-1.patch
Appliquez un correctif pour exclure des tests connus pour échouer
de la suite de testse:
patch -Np1 -i ../icedtea-2.4.1-fix_tests-1.patch
Configurez et construisez le paquet avec les commandes suivantes
(les valeurs de with-pkgversion et de with-version-suffix peuvent
être modifiées selon les préférences de l'utilisateur):
unset JAVA_HOME &&
./autogen.sh &&
./configure --with-jdk-home=/opt/OpenJDK-1.7.0.40-bin \
--enable-nss \
--with-version-suffix=blfs \
--enable-pulse-java &&
make
Note
Si vous n'avez pas installé l'archive spécifiée précédemment,
elle sera automatiquement téléchargée ici.
Pour tester le résultat, tapez : make jtregcheck. La version
incluse dans jtreg est ancienne,
et la suite de tests est également très dépendante du système hôte
et de l'environnement qui la lance. Vous devez vous attendre à voir
n'importe où entre 40 et 100 échecs dans jdk avec plus de 10
erreurs dans les tests eux-mêmes. La majorité des plus de 6000
tests doivent réussir. La raison pour la grande variété des
résultats est dû à comment l'environnement doit être strict. Des
architectures différentes, des versions différentes des
bibliothèques dépendantes, un environnement X Window et un
gestionnaire de fenêtres inattendus, le certificat utilisé pour
générer le fichier cacerts
, et même
toutes les entrées de l'utilisateur, ou la gestion de l'énergie, ou
les interruptions de l'économiseur d'écrans pendant les tests
peuvent créer de nombreux échecs. Comme les tests cassés connus ont
été enlevé, avec le correctif fix_tests, les échecs aux tests
graphiques ne peuvent pas être prévues (sauf à les enlever tous).
La meilleure façon pour un résultat complètement propre est de
lancer la suite de tests dans un sur un écran différent (Xvfb). Et
même encore, les I/O du disque peuvent créer des échecs.
export DISPLAY=:20 &&
Xvfb :20 -screen 0 1x1x24 -ac&
echo $!> Xvfb.pid &&
make -k jtregcheck &&
kill -9 `cat Xvfb.pid` &&
unset DISPLAY &&
rm -f Xvfb.pid
Installez le paquet avec les commandes suivantes en tant
qu'utilisateur root
:
chmod 0644 openjdk.build/j2sdk-image/lib/sa-jdi.jar &&
cp -R openjdk.build/j2sdk-image /opt/OpenJDK-1.7.0.40 &&
chown -R root:root /opt/OpenJDK-1.7.0.40
Explications des commandes
./autogen.sh :
Cette commande force la reconstruction des fichiers auto-générés
pour tenir compte des nouvelles options ajoutés dans configure
.
--with-jdk-home
: Ce
paramètre fournit l'emplacement du JDK temporaire.
--with-pkgversion
: Ce
paramètre peut être utilisé pour modifier la chaîne de version en
supplément de "IcedTea".
--with-version-suffix
: Ce
paramètre ajoute le texte donné dans la chaîne de version de JDK.
--enable-pulse-java
:
Ce paramètre autorise la construction des bibliothèques pulseaudio
(utilisées pour fournir une implémentation complète qui est
raisonnablement compatible avec le JDK propriétaire).
chmod -v 0644
...sa-jdi.jar : Corrige les permissions dans
un fichier généré pour que tous les utilisateurs puissent y
accéder.
Configuration de
OpenJDK
Information de configuration
Il y a maintenant deux SDK OpenJDK installés dans /opt
. Vous devez décider lequel vous voulez
utiliser par défaut. Par exemple, si vous décidez d'utiliser la
version précompilée de OpenJDK,
faite les commandes suivantes en tant qu'utilisateur root
:
ln -v -nsf OpenJDK-1.7.0.40-bin /opt/jdk
L'information ci dessous suppose que votre système est initialisé
en utilisant les instructions trouvées à « Les fichiers de
démarrage du shell Bash ». Vous devez extraire
l'information pertinente dessous et l'incorporer dans votre
fichier de démarrage du système si votre système est initialisé
différemment.
Ajoutez le fichier suivant de démarrage de openjdk.sh
dans le répertoire /etc/profile.d
avec les commandes suivantes en
tant qu'utilisateur root
:
cat > /etc/profile.d/openjdk.sh << "EOF"
# Begin /etc/profile.d/openjdk.sh
# Set JAVA_HOME directory
JAVA_HOME=/opt/jdk
# Adjust PATH
pathappend $JAVA_HOME/bin PATH
# Auto Java CLASSPATH
# Copy jar files to, or create symlinks in this directory
AUTO_CLASSPATH_DIR=/usr/share/java
pathprepend . CLASSPATH
for dir in `find ${AUTO_CLASSPATH_DIR} -type d 2>/dev/null`; do
pathappend $dir CLASSPATH
done
for jar in `find ${AUTO_CLASSPATH_DIR} -name "*.jar" 2>/dev/null`; do
pathappend $jar CLASSPATH
done
export JAVA_HOME CLASSPATH
unset AUTO_CLASSPATH_DIR dir jar
# End /etc/profile.d/openjdk.sh
EOF
Finalement, ajoutez les pages de man dans la configuration de
man_db. En tant qu'utilisateur
root
:
cat >> /etc/man_db.conf << "EOF" &&
MANDATORY_MANPATH /opt/jdk/man
MANPATH_MAP /opt/jdk/bin /opt/jdk/man
MANDB_MAP /opt/jdk/man /var/cache/man/jdk
EOF
mandb -c /opt/jdk/man
Installez ou mettez à
jour les fichiers "JRE Certificate Authority Certificates"
(cacerts)
Utilisez la procédure suivante pour vérifier si le fichier
cacerts
a été correctement installé
pendant l'installation de OpenJDK ou si Certificate Authority
Certificates a été mis à jour, les instructions suivantes
généreront un nouveau fichier JRE de cacerts
. En premier, vérifiez si cacerts
a été correctement installé:
cd /opt/jdk
bin/keytool -list -keystore jre/lib/security/cacerts
A l'invite "Enter keystore password:", appuyez sur "Enter" s'il
n'y a pas de mot de passe de défini. Si cacerts
a été installé correctement, vous allez
voir une liste de certificats avec des informations relatives à
chacun d'eux. Si non, vous devrez les installer manuellement. En
premier, génèrez le script mkcacerts en tant
qu'utilisateur root
:
cat > /opt/jdk/bin/mkcacerts << "EOF"
#!/bin/sh
# Simple script to extract x509 certificates and create a JRE cacerts file.
function get_args()
{
if test -z "${1}" ; then
showhelp
exit 1
fi
while test -n "${1}" ; do
case "${1}" in
-f | --cafile)
check_arg $1 $2
CAFILE="${2}"
shift 2
;;
-d | --cadir)
check_arg $1 $2
CADIR="${2}"
shift 2
;;
-o | --outfile)
check_arg $1 $2
OUTFILE="${2}"
shift 2
;;
-k | --keytool)
check_arg $1 $2
KEYTOOL="${2}"
shift 2
;;
-s | --openssl)
check_arg $1 $2
OPENSSL="${2}"
shift 2
;;
-h | --help)
showhelp
exit 0
;;
*)
showhelp
exit 1
;;
esac
done
}
function check_arg()
{
echo "${2}" | grep -v "^-" > /dev/null
if [ -z "$?" -o ! -n "$2" ]; then
echo "Error: $1 requires a valid argument."
exit 1
fi
}
# The date binary is not reliable on 32bit systems for dates after 2038
function mydate()
{
local y=$( echo $1 | cut -d" " -f4 )
local M=$( echo $1 | cut -d" " -f1 )
local d=$( echo $1 | cut -d" " -f2 )
local m
if [ ${d} -lt 10 ]; then d="0${d}"; fi
case $M in
Jan) m="01";;
Feb) m="02";;
Mar) m="03";;
Apr) m="04";;
May) m="05";;
Jun) m="06";;
Jul) m="07";;
Aug) m="08";;
Sep) m="09";;
Oct) m="10";;
Nov) m="11";;
Dec) m="12";;
esac
certdate="${y}${m}${d}"
}
function showhelp()
{
echo "`basename ${0}` creates a valid cacerts file for use with IcedTea."
echo ""
echo " -f --cafile The path to a file containing PEM formated CA"
echo " certificates. May not be used with -d/--cadir."
echo " -d --cadir The path to a diectory of PEM formatted CA"
echo " certificates. May not be used with -f/--cafile."
echo " -o --outfile The path to the output file."
echo ""
echo " -k --keytool The path to the java keytool utility."
echo ""
echo " -s --openssl The path to the openssl utility."
echo ""
echo " -h --help Show this help message and exit."
echo ""
echo ""
}
# Initialize empty variables so that the shell does not polute the script
CAFILE=""
CADIR=""
OUTFILE=""
OPENSSL=""
KEYTOOL=""
certdate=""
date=""
today=$( date +%Y%m%d )
# Process command line arguments
get_args ${@}
# Handle common errors
if test "${CAFILE}x" == "x" -a "${CADIR}x" == "x" ; then
echo "ERROR! You must provide an x509 certificate store!"
echo "\'$(basename ${0}) --help\' for more info."
echo ""
exit 1
fi
if test "${CAFILE}x" != "x" -a "${CADIR}x" != "x" ; then
echo "ERROR! You cannot provide two x509 certificate stores!"
echo "\'$(basename ${0}) --help\' for more info."
echo ""
exit 1
fi
if test "${KEYTOOL}x" == "x" ; then
echo "ERROR! You must provide a valid keytool program!"
echo "\'$(basename ${0}) --help\' for more info."
echo ""
exit 1
fi
if test "${OPENSSL}x" == "x" ; then
echo "ERROR! You must provide a valid path to openssl!"
echo "\'$(basename ${0}) --help\' for more info."
echo ""
exit 1
fi
if test "${OUTFILE}x" == "x" ; then
echo "ERROR! You must provide a valid output file!"
echo "\'$(basename ${0}) --help\' for more info."
echo ""
exit 1
fi
# Get on with the work
# If using a CAFILE, split it into individual files in a temp directory
if test "${CAFILE}x" != "x" ; then
TEMPDIR=`mktemp -d`
CADIR="${TEMPDIR}"
# Get a list of staring lines for each cert
CERTLIST=`grep -n "^-----BEGIN" "${CAFILE}" | cut -d ":" -f 1`
# Get a list of ending lines for each cert
ENDCERTLIST=`grep -n "^-----END" "${CAFILE}" | cut -d ":" -f 1`
# Start a loop
for certbegin in `echo "${CERTLIST}"` ; do
for certend in `echo "${ENDCERTLIST}"` ; do
if test "${certend}" -gt "${certbegin}"; then
break
fi
done
sed -n "${certbegin},${certend}p" "${CAFILE}" > "${CADIR}/${certbegin}.pem"
keyhash=`${OPENSSL} x509 -noout -in "${CADIR}/${certbegin}.pem" -hash`
echo "Generated PEM file with hash: ${keyhash}."
done
fi
# Write the output file
for cert in `find "${CADIR}" -type f -name "*.pem" -o -name "*.crt"`
do
# Make sure the certificate date is valid...
date=$( ${OPENSSL} x509 -enddate -in "${cert}" -noout | sed 's/^notAfter=//' )
mydate "${date}"
if test "${certdate}" -lt "${today}" ; then
echo "${cert} expired on ${certdate}! Skipping..."
unset date certdate
continue
fi
unset date certdate
ls "${cert}"
tempfile=`mktemp`
certbegin=`grep -n "^-----BEGIN" "${cert}" | cut -d ":" -f 1`
certend=`grep -n "^-----END" "${cert}" | cut -d ":" -f 1`
sed -n "${certbegin},${certend}p" "${cert}" > "${tempfile}"
echo yes | env LC_ALL=C "${KEYTOOL}" -import -alias `basename "${cert}"` -keystore \
"${OUTFILE}" -storepass 'changeit' -file "${tempfile}"
rm "${tempfile}"
done
if test "${TEMPDIR}x" != "x" ; then
rm -rf "${TEMPDIR}"
fi
exit 0
EOF
chmod -c 0755 /opt/jdk/bin/mkcacerts
Note
Faire un très grand copier/coller directement dans un terminal
peut donner un fichier corrompu.Copier depuis un éditeur peut
contourner ce problème.
Commencez par faire une sauvegarde du fichier /opt/jdk/jre/lib/security/cacerts
, s'il y en a
un. Pour créer le nouveau, en tant qu'utilisateur root
:
/opt/jdk/bin/mkcacerts -d "/etc/ssl/certs/" -k "/opt/jdk/bin/keytool" \
-s "/usr/bin/openssl" -o "/opt/jdk/jre/lib/security/cacerts"