Comincerei dicendo che la domanda non è stata fatta in modo completamente corretto, poiché è del tutto possibile modificare effettivamente il file senza riavviare Tomcat, ma le modifiche vengono ignorate dal processo in esecuzione.
La vera domanda sarebbe come applicare le modifiche server.xml
senza riavviare Tomcat.
Raccogliendo informazioni dal processo di avvio e dalle pagine del caricatore di classi sulla documentazione online di Tomcat, è possibile comprenderlo in modo più dettagliato.
Più specificamente, è descritto in serverStartup.txt e nel diagramma UML del processo di avvio e le parti pertinenti possono essere riassunte come segue:
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.
Ciò accade dopo la creazione del classloader Bootstrap del motore servlet (Catalina).
Con queste informazioni, è chiaro ora quando nel processo di avvio server.xml
viene analizzato il file, ma non risponde realmente alla domanda sul perché è necessario riavviare Tomcat per applicare le modifiche a questo file.
La risposta è che una parte di essa può essere modificata in modo dinamico in fase di esecuzione utilizzando JMX . Perché ciò sia possibile, è stato necessario registrare l'MBean appropriato (passo b6 sopra) e anche accettare le operazioni SET (alcuni MBean hanno solo un'interfaccia GET).
Nel tuo caso specifico, non c'è modo di creare e registrare un nuovo host in fase di runtime perché non è previsto per questo, e questo è il motivo per cui devi riavviare il processo Tomcat per fare in modo che il classloader Bootstrap crei un'istanza di quell'oggetto e lo registri con Agente JMX.
Successivamente, è possibile modificare quell'host da un client JMX come jconsole
quello fornito in bundle con qualsiasi JDK.
Connettiti jconsole
a un Tomcat abilitato per JMX e sfoglia l'host MBean per verificare tutti gli attributi disponibili:
e controlla tutte le operazioni disponibili (una mostrata sotto come esempio):