Я хотел бы начать с того, что вопрос задан не совсем правильно, так как на самом деле можно редактировать файл без перезапуска Tomcat, но изменения игнорируются запущенным процессом.
Реальный вопрос заключается в том, как применить изменения server.xml
без перезагрузки Tomcat.
Собирая информацию из процесса запуска и страниц загрузчика классов в онлайн-документации Tomcat, можно понять это более подробно.
Более конкретно, это описано в serverStartup.txt и UML-диаграмме процесса запуска, и соответствующие части можно суммировать следующим образом:
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.
Это происходит после создания загрузчика классов Bootstrap из движка сервлета (Catalina).
С этой информацией теперь ясно, когда в процессе запуска server.xml
файл анализируется, но на самом деле он не отвечает на вопрос, почему требуется перезапустить Tomcat, чтобы применить изменения к этому файлу.
Ответ в том, что некоторая его часть может динамически изменяться во время выполнения с использованием JMX . Чтобы это было возможно, необходимо зарегистрировать соответствующий MBean (шаг b6 выше), а также принять операции SET (некоторые MBean имеют только интерфейс GET).
В вашем конкретном случае нет способа создать и зарегистрировать новый хост во время выполнения, потому что для него нет условий, и именно поэтому вам нужно перезапустить процесс Tomcat, чтобы загрузчик классов Bootstrap создал этот объект и зарегистрировал его в Агент JMX
После этого можно изменить этот хост из JMX-клиента, например, jconsole
который поставляется в комплекте с любым JDK.
Подключите вас jconsole
к Tomcat с поддержкой JMX и просмотрите Host MBean, чтобы проверить все доступные атрибуты:
и проверьте все доступные операции (одна из них показана ниже в качестве примера):