Eu começaria dizendo que a pergunta não foi feita corretamente, pois é possível editar o arquivo sem reiniciar o Tomcat, mas as alterações são ignoradas pelo processo em execução.
A verdadeira questão seria como aplicar alterações server.xml
sem reiniciar o Tomcat.
Reunindo informações do processo de inicialização e das páginas do carregador de classes na documentação on-line do Tomcat, é possível entender isso com mais detalhes.
Mais especificamente, está descrito em serverStartup.txt e no diagrama UML do processo de inicialização e as partes relevantes podem ser resumidas da seguinte forma:
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.
Isso acontece após a criação do carregador de classe Bootstrap do mecanismo de servlet (Catalina).
Com essas informações, fica claro agora quando, no processo de inicialização, o server.xml
arquivo é analisado, mas na verdade não responde à pergunta de por que é necessário reiniciar o Tomcat para aplicar alterações nesse arquivo.
A resposta é que alguma parte dela pode ser modificado dinamicamente em tempo de execução usando JMX . Para que isso seja possível, é necessário registrar o MBean apropriado (etapa b6 acima) e também aceitar operações SET (alguns MBeans possuem apenas uma interface GET).
No seu caso específico, não há como criar e registrar um novo Host em tempo de execução porque não há previsão para isso, e é por isso que você precisa reiniciar o processo do Tomcat para que o carregador de classes do Bootstrap instanciar esse objeto e registrá-lo com Agente JMX.
Posteriormente, é possível modificar esse host a partir de um cliente JMX, como o jconsole
fornecido com qualquer JDK.
Conecte-o jconsole
a um Tomcat habilitado para JMX e navegue no MBean do Host para verificar todos os atributos disponíveis:
e verifique todas as operações disponíveis (uma delas mostrada abaixo como exemplo):