Mise à jour Tomcat 7 Ubuntu
Sur une installation initiale, la commande suivante est suffisante.
#sudo apt-get install tomcat7
Cependant, dans le cadre de cette installation, une instance de Tomcat en version 6 était déjà en place et le paquet ne pouvait s'installer avec le message d'erreur suivant.
#apt-get install tomcat7 Lecture des listes de paquets... Fait Construction de l'arbre des dépendances Lecture des informations d'état... Fait Certains paquets ne peuvent être installés. Ceci peut signifier que vous avez demandé l'impossible, ou bien, si vous utilisez la distribution unstable, que certains paquets n'ont pas encore été créés ou ne sont pas sortis d'Incoming. L'information suivante devrait vous aider à résoudre la situation : Les paquets suivants contiennent des dépendances non satisfaites : tomcat7 : Dépend: tomcat7-common (>= 7.0.56-2ubuntu0.1) mais ne sera pas installé E: Impossible de corriger les problèmes, des paquets défectueux sont en mode « garder en l'état ».
Cet article présente donc la procédure de mise à jour.
Sommaire
Votre avis
Nobody voted on this yet
|
|
Sauvegarde application
La mise à jour peut nécessité la suppression du paquet tomcat6
initial. Il est donc important d'effectuer une sauvegarde des applications déjà déployées. Dans le cadre de cette installation, les commandes suivantes sont réalisées, afin de conserver les informations suivantes :
- Applications installées dans
/var/lib/tomcat6/webapps
. - Répertoire de travail des applications (Jenkins, Sonar, Nexus ...) dans
/usr/share/tomcat6
.
#sudo mkdir -p /var/opt/backups/tomcat #sudo cp -p -R /var/lib/tomcat6/webapps /var/opt/backups/tomcat #sudo mkdir /var/opt/backups/tomcat/share #sudo cp -a -p -R /usr/share/tomcat6/. /var/opt/backups/tomcat/share/
A noter que le répertoire /usr/share/tomcat6
contient des répertoires cachés, d'où l'utilisation de l'argument -a
et l'emplacement /usr/share/tomcat6/.
pour effectuer la sauvegarde de ces répertoires.
Cependant, la suppression des paquets n'entraîne pas la suppression des fichiers personnalisés.
Suppression paquets
La suppression du paquet tomcat6
n'est pas suffisante. La liste des paquets cibles est déterminée à l'aide de l'outil dpkg
#dkpg --get-selections | grep tomcat6 libtomcat6-java install tomcat6 install tomcat6-admin install tomcat6-common install
La suppression du paquet tomcat6-common
entraîne la suppression de l'ensemble des paquets.
#sudo apt-get purge tomcat6-common Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires : authbind libcommons-collections3-java libcommons-dbcp-java libcommons-pool-java libecj-java libservlet2.5-java libtomcat6-java Veuillez utiliser « apt-get autoremove » pour les supprimer. Les paquets suivants seront ENLEVÉS : tomcat6* tomcat6-admin* tomcat6-common* 0 mis à jour, 0 nouvellement installés, 3 à enlever et 3 non mis à jour. Après cette opération, 685 ko d'espace disque seront libérés. Souhaitez-vous continuer ? [O/n] O
En fin d'exécution des messages avertissent que les fichiers personnalisés, applications / répertoires de travail, ne sont pas supprimés.
dpkg : avertissement : lors de la suppression de tomcat6, le répertoire « /var/lib/tomcat6/webapps » n'était pas vide, donc il n'a pas été supprimé dpkg : avertissement : lors de la suppression de tomcat6, le répertoire « /var/lib/tomcat6/shared » n'était pas vide, donc il n'a pas été supprimé Suppression de tomcat6-admin (6.0.41-1) ... Purge des fichiers de configuration de tomcat6-admin (6.0.41-1) ... dpkg : avertissement : lors de la suppression de tomcat6-admin, le répertoire « /etc/tomcat6/Catalina/localhost » n'était pas vide, donc il n'a pas été supprimé Suppression de tomcat6-common (6.0.41-1) ...
Comme indiqué lors du démarrage de la suppression, des paquets complémentaires peuvent être supprimés, même si une partie sera réinstallée avec tomcat7
.
#sudo apt-get purge authbind libcommons-collections3-java libcommons-dbcp-java libcommons-pool-java libecj-java libservlet2.5-java libtomcat6-java
Installation
Une fois la version précédente supprimée, le paquet tomcat7
peut être installé.
#sudo apt-get install tomcat7 Les paquets supplémentaires suivants seront installés : authbind libcommons-collections3-java libcommons-dbcp-java libcommons-pool-java libecj-java libservlet3.0-java libtomcat7-java tomcat7-common Paquets suggérés : libcommons-collections3-java-doc libcommons-dbcp-java-doc ecj ant libecj-java-gcj tomcat7-docs tomcat7-admin tomcat7-examples tomcat7-user libtcnative-1 Les NOUVEAUX paquets suivants seront installés : authbind libcommons-collections3-java libcommons-dbcp-java libcommons-pool-java libecj-java libservlet3.0-java libtomcat7-java tomcat7 tomcat7-common 0 mis à jour, 9 nouvellement installés, 0 à enlever et 3 non mis à jour. Il est nécessaire de prendre 6 505 ko dans les archives. Après cette opération, 8 295 ko d'espace disque supplémentaires seront utilisés. Souhaitez-vous continuer ? [O/n] O
Restauration
L'instance Tomcat7 est alors disponible. Il suffit alors de reprendre les fichiers personnalisés, applications / répertoires de travail, préalablement sauvegardés ou depuis la précédente installation.
#sudo cp -p -R /var/lib/tomcat6/webapps* /var/lib/tomcat7/webapps #sudo cp -a -p -R /usr/share/tomcat6/. /usr/share/tomcat7/
Dans le cadre de cette installation, des librairies avaient été rendues disponibles dans le répertoire lib de l'instance précédente, pour diverses applications.
#sudo ll /usr/share/tomcat6/lib/ total 8 drwxr-xr-x 2 root root 4096 août 17 23:47 ./ drwxr-xr-x 10 root root 4096 août 17 23:46 ../ lrwxrwxrwx 1 root root 29 déc. 12 2010 activation.jar -> ../../java/activation-1.1.jar lrwxrwxrwx 1 root root 23 déc. 12 2010 mail.jar -> ../../java/mail-1.4.jar
Lors de la recopie, ces liens sont bien pris en compte.
Paramétrages
Permissions
Lors de l'installation avec apt-get
, les permissions des fichiers peuvent être affectées au compte root
. Il peut en résulter des problèmes lors de l'utilisation de produits. Il est donc nécessaire de modifier certains fichiers / répertoires.
#sudo chown tomcat7:tomcat7 /usr/share/tomcat7
Script démarrage
Comme dans le cadre de la mise à jour de Ubuntu 12.04, le script de démarrage de Tomcat doit être modifié s'il est souhaité d'utiliser une JDK Oracle, et non pas OpenJDK. Par défaut, le lien /usr/lib/jvm/default-java
est utilisé, pointant sur une instance OpenJDK.
#ll /usr/lib/jvm/ total 104 drwxr-xr-x 6 root root 4096 août 8 01:38 ./ drwxr-xr-x 114 root root 69632 août 17 23:50 ../ lrwxrwxrwx 1 root root 24 déc. 17 2013 default-java -> java-1.7.0-openjdk-amd64/ lrwxrwxrwx 1 root root 20 avril 13 2012 java-1.6.0-openjdk-amd64 -> java-6-openjdk-amd64/ -rw-r--r-- 1 root root 2387 août 5 05:35 .java-1.6.0-openjdk-amd64.jinfo lrwxrwxrwx 1 root root 20 déc. 20 2013 java-1.7.0-openjdk-amd64 -> java-7-openjdk-amd64/ -rw-r--r-- 1 root root 2439 juil. 24 13:58 .java-1.7.0-openjdk-amd64.jinfo drwxr-xr-x 5 root root 4096 mai 6 2012 java-6-openjdk-amd64/ drwxr-xr-x 3 root root 4096 mai 6 2012 java-6-openjdk-common/ drwxr-xr-x 5 root root 4096 déc. 21 2013 java-7-openjdk-amd64/ drwxr-xr-x 8 root root 4096 oct. 16 2014 java-7-oracle/ -rw-r--r-- 1 root root 2543 oct. 16 2014 .java-7-oracle.jinfo
La modification mise en place spécifie explicitement la version à utiliser, une version 1.7 de Oracle, dans le script /etc/init.d/tomcat7
. Cela n'est pas une solution autant paramétrable que le standard, mais convient parfaitement pour les besoins de cette installation.
# this is a work-around until there is a suitable runtime replacement
# for dpkg-architecture for arch:all packages
# this function sets the variable JDK_DIRS
find_jdks()
{
for java_version in 9 8 7 6
do
for jvmdir in /usr/lib/jvm/java-${java_version}-openjdk-* \
/usr/lib/jvm/jdk-${java_version}-oracle-* \
/usr/lib/jvm/jre-${java_version}-oracle-*
do
if [ -d "${jvmdir}" -a "${jvmdir}" != "/usr/lib/jvm/java-${java_version}-openjdk-common" ]
then
JDK_DIRS="${JDK_DIRS} ${jvmdir}"
fi
done
done
# Add older non multi arch installations
JDK_DIRS="${JDK_DIRS} /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-sun /usr/lib/jvm/java-7-oracle"
}
# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not
# defined in $DEFAULT)
JDK_DIRS="/usr/lib/jvm/java-7-oracle /usr/lib/jvm/default-java"
# JDK_DIRS="/usr/lib/jvm/default-java"
find_jdks
Le script modifié étant utilisé pour les services, les modifications doivent être pris en compte par le système Systemd
. L'ensemble des services est donc rechargé.
#sudo systemctl daemon-reload
Dans le cadre de la montée de version de Java 1.8, la même modification est réalisée pour prendre en compte celle-ci. Le problème persiste avec le fait que c'est les version openjdk
qui ont priorité. La modification apportée est la suivante.
# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not
# defined in $DEFAULT)
JDK_DIRS="/usr/lib/jvm/java-8-oracle /usr/lib/jvm/default-java"
#JDK_DIRS="/usr/lib/jvm/java-7-oracle /usr/lib/jvm/default-java"
# JDK_DIRS="/usr/lib/jvm/default-java"
find_jdks
Variables d'environnement
Dans le cadre de l'installation de Subsonic, un fichier setenv.sh
avait été mis en place afin de configurer une variable d'environnement. Ce fichier avait été placé dans le répertoire /var/lib/tomcat6/bin
et peut être copié telquel dans la nouvelle instance, soit dans le répertoire /var/lib/tomcat7/bin
.
Dans le cadre de cette installation, tout le répertoire est recopié car il ne contenait que ce fichier.
#sudo cp -p -R /var/lib/tomcat6/bin /var/lib/tomcat7
Contexte ROOT
Il est constaté un avertissement dans le trace de l'instance, soit /var/log/tomcat7/catalina.out
dans le cadre de cette installation, au démarrage du serveur. Celui-ci indique un paramétrage pas totalement conforme pour l'application ROOT
INFOS: Déploiement du répertoire /var/lib/tomcat7/webapps/ROOT de l'application web janv. 16, 2016 2:00:25 PM org.apache.catalina.core.StandardContext setPath AVERTISSEMENT: A context path must either be an empty string or start with a '/' and do not end with a '/'. The path [/] does not meet these criteria and has been changed to []
Cet avertissement n'est pas spécialement problématique et pourrait être ignoré. Cependant pour le corriger, il va suffire de modifier le fichier context.xml
de l'application ROOT
, se situant à l'emplacement /var/lib/tomcat7/webapps/ROOT/META-INF/context.xml
dans le cadre de cette installation.
Le contenu original est le suivant.
<Context path="/"
antiResourceLocking="false" />
Il est modifié comme indiqué dans l'avertissement en supprimant la valeur /
du paramètre path
.
<Context path=""
antiResourceLocking="false" />
Classpath
Sur une machine Ubuntu, les messages d'avertissement suivant étaient présent dans la trace de démarrage de Tomcat.
janv. 08, 2016 6:02:05 PM org.apache.coyote.AbstractProtocol stop INFOS: Stopping ProtocolHandler ["http-bio-8080"] janv. 08, 2016 6:02:06 PM org.apache.coyote.AbstractProtocol destroy INFOS: Destroying ProtocolHandler ["http-bio-8080"] janv. 08, 2016 6:02:15 PM org.apache.catalina.startup.ClassLoaderFactory validateFile AVERTISSEMENT: Problem with directory [/usr/share/tomcat7/common/classes], exists: [false], isDirectory: [false], canRead: [false] janv. 08, 2016 6:02:15 PM org.apache.catalina.startup.ClassLoaderFactory validateFile AVERTISSEMENT: Problem with directory [/usr/share/tomcat7/common], exists: [false], isDirectory: [false], canRead: [false] janv. 08, 2016 6:02:15 PM org.apache.catalina.startup.ClassLoaderFactory validateFile AVERTISSEMENT: Problem with directory [/usr/share/tomcat7/server/classes], exists: [false], isDirectory: [false], canRead: [false] janv. 08, 2016 6:02:15 PM org.apache.catalina.startup.ClassLoaderFactory validateFile AVERTISSEMENT: Problem with directory [/usr/share/tomcat7/server], exists: [false], isDirectory: [false], canRead: [false] janv. 08, 2016 6:02:15 PM org.apache.catalina.startup.ClassLoaderFactory validateFile AVERTISSEMENT: Problem with directory [/usr/share/tomcat7/shared/classes], exists: [false], isDirectory: [false], canRead: [false] janv. 08, 2016 6:02:17 PM org.apache.catalina.startup.VersionLoggerListener log INFOS: Server version: Apache Tomcat/7.0.64 (Ubuntu)
Ceux-ci ne posent aucun problème, il mentionne uniquement un avertissement concernant la configuration des classpaths. Pour rappel, l'instance Tomcat est déployée sous /var/lib/tomcat7
, dont le contenu est le suivant.
#ll /var/lib/tomcat7 total 28 drwxr-xr-x 7 root root 4096 sept. 11 15:07 ./ drwxr-xr-x 72 root root 4096 déc. 30 14:25 ../ drwxr-xr-x 2 tomcat7 tomcat7 4096 sept. 10 09:32 bin/ drwxr-xr-x 3 tomcat7 tomcat7 4096 août 17 23:50 common/ lrwxrwxrwx 1 root root 12 juin 19 2015 conf -> /etc/tomcat7/ lrwxrwxrwx 1 root root 17 juin 19 2015 logs -> ../../log/tomcat7/ drwxr-xr-x 3 tomcat7 tomcat7 4096 août 17 23:50 server/ drwxr-xr-x 3 tomcat7 tomcat7 4096 août 17 23:50 shared/ drwxrwxr-x 7 tomcat7 tomcat7 4096 déc. 23 01:53 webapps/ lrwxrwxrwx 1 root root 19 juin 19 2015 work -> ../../cache/tomcat7/
A noter le lien conf
qui pointe sur le répertoire sous /etc/tomcat7
. Celui-ci contient le fichier catalina.properties
, dans lequel l'instance est configurée, et notament différents classpaths.
#
#
# List of comma-separated paths defining the contents of the "common"
# classloader. Prefixes should be used to define what is the repository type.
# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
# If left as blank,the JVM system loader will be used as Catalina's "common"
# loader.
# Examples:
# "foo": Add this folder as a class repository
# "foo/*.jar": Add all the JARs of the specified folder as class
# repositories
# "foo/bar.jar": Add bar.jar as a class repository
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.home}/common/classes,${catalina.home}/common/*.jar
#
# List of comma-separated paths defining the contents of the "server"
# classloader. Prefixes should be used to define what is the repository type.
# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
# If left as blank, the "common" loader will be used as Catalina's "server"
# loader.
# Examples:
# "foo": Add this folder as a class repository
# "foo/*.jar": Add all the JARs of the specified folder as class
# repositories
# "foo/bar.jar": Add bar.jar as a class repository
server.loader=${catalina.home}/server/classes,${catalina.home}/server/*.jar
#
# List of comma-separated paths defining the contents of the "shared"
# classloader. Prefixes should be used to define what is the repository type.
# Path may be relative to the CATALINA_BASE path or absolute. If left as blank,
# the "common" loader will be used as Catalina's "shared" loader.
# Examples:
# "foo": Add this folder as a class repository
# "foo/*.jar": Add all the JARs of the specified folder as class
# repositories
# "foo/bar.jar": Add bar.jar as a class repository
# Please note that for single jars, e.g. bar.jar, you need the URL form
# starting with file:.
shared.loader=${catalina.home}/shared/classes,${catalina.home}/shared/*.jar
Les répertoires levant une alertes sont donc mentionnés dans les paramètres de configuration.
- common.loader
- server.loader
- shared.loader
Ils sont configurés pour être dans l'arborescence définie par la variable d'environnement catalia.home
. Or ceux-ci sont bien présents, mais sous /var/lib/tomcat7
, correspond à la variable d'environnement catalina.base
.
Par conséquent, deux solutions peuvent être implémentés afin de supprimer les avertissements.
- Modifier le fichier
catalina.properties
en spécifiant un chemin correct. Cependant, l'instance ayant été installer avec un paquet, des conflits devront être résolus lors des mises à jour. - Créer l'arborescence cible. Cette solution est préférée et est mise en place à l'aide des commandes suivantes.
#sudo mkdir -p /usr/share/tomcat7/common/classes #sudo mkdir -p /usr/share/tomcat7/server/classes #sudo mkdir -p /usr/share/tomcat7/shared/classes
Afin d'être homogène avec l'ensemble des fichiers, les permissions sont accordés au compte tomcat7
.
#sudo chown -R tomcat7:tomcat7 /usr/share/tomcat7/common #sudo chown -R tomcat7:tomcat7 /usr/share/tomcat7/server #sudo chown -R tomcat7:tomcat7 /usr/share/tomcat7/shared
Les répertoires sous /var/lib/tomcat7
sont par défaut vides. Il n'y a donc aucun risque de reproduire cette arborescence dans le cadre de cette mise en place.
Configuration Maven
Lors de l'installation de Maven, les permissions sur le dépôt avaient été placées pour le compte tomcat6
. Il est donc nécessaire de mettre jour ces permissions.
#sudo chown -R root:tomcat7 /usr/share/maven #sudo chmod -R 775 /usr/share/maven/repository
Purge
Après avoir vérifier le bon fonctionne du serveur, les répertoires résiduels peuvent être supprimés.
#sudo rm -rf /usr/share/tomcat6 #sudo rm -rf /var/lib/tomcat6 #sudo rm -rf /etc/tomcat6
Stratégies de Backup
Dans le cadre de cette machine, plusieurs applications ont été mises en place. Des scripts ont été écrits afin de sauvegarder les fichiers / répertoires qui sont parfois dans l'instance de Tomcat. Suite à cette mise à jour, les scripts doivent être repris afin de prendre en compte le nouvel emplacement.