Je commencerais par dire que la question n'est pas complètement correctement posée, car il est tout à fait possible de modifier le fichier sans redémarrer Tomcat, mais les modifications sont ignorées par le processus en cours.
La vraie question serait de savoir comment appliquer les modifications server.xml
sans redémarrer Tomcat.
En rassemblant des informations sur le processus de démarrage et les pages du chargeur de classe sur la documentation en ligne de Tomcat, il est possible de comprendre cela plus en détail.
Plus précisément, il est décrit dans serverStartup.txt et le diagramme UML du processus de démarrage et les parties pertinentes peuvent être résumées comme suit:
Sequence 1. Start from Command Line
...
Sequence 2. Process command line argument (start, startd, stop, stopd)
Class: org.apache.catalina.startup.Bootstrap (assume command->start)
What it does:
a) Catalina.setAwait(true);
b) Catalina.load()
b3) createStartDigester()
Configures a digester for the main server.xml elements
b4) Load the server.xml and parse it using the digester
Parsing the server.xml using the digester is an automatic
XML-object mapping tool, that will create the objects defined
in server.xml
Startup of the actual container has not started yet.
b6) Calls initialize on all components, this makes each object
register itself with the JMX agent.
Cela se produit après la création du chargeur de classe Bootstrap du moteur de servlet (Catalina).
Avec ces informations, il est clair maintenant quand dans le processus de démarrage le server.xml
fichier est analysé, mais cela ne répond pas vraiment à la question de savoir pourquoi il est nécessaire de redémarrer Tomcat pour appliquer les modifications à ce fichier.
La réponse est que certaines parties peut être modifiée dynamiquement lors de l' exécution en utilisant JMX . Pour que cela soit possible, le MBean approprié a dû être enregistré (étape b6 ci-dessus), et doit également accepter les opérations SET (certains MBeans n'ont qu'une interface GET).
Dans votre cas spécifique, il n'y a aucun moyen de créer et d'enregistrer un nouvel hôte au moment de l'exécution car il n'y a aucune disposition pour cela, et c'est la raison pour laquelle vous devez redémarrer le processus Tomcat pour que le chargeur de classe Bootstrap instancie cet objet et l'enregistre avec Agent JMX.
Ensuite, il est possible de modifier cet hôte à partir d'un client JMX tel que jconsole
celui fourni avec n'importe quel JDK.
Connectez-vous jconsole
à un Tomcat compatible JMX et parcourez le MBean hôte pour vérifier tous les attributs disponibles:
et vérifiez toutes les opérations disponibles (l'une d'entre elles ci-dessous à titre d'exemple):