Zacznę od stwierdzenia, że pytanie nie jest całkowicie poprawnie wykonane, ponieważ całkiem możliwe jest edytowanie pliku bez ponownego uruchamiania Tomcat, ale zmiany są ignorowane przez uruchomiony proces.
Prawdziwe pytanie brzmi: jak zastosować zmiany server.xml
bez ponownego uruchamiania Tomcat.
Gromadząc informacje z procesu uruchamiania i stron modułu ładującego klasy w dokumentacji online Tomcat, można to zrozumieć bardziej szczegółowo.
Mówiąc dokładniej, jest to opisane w serverStartup.txt i diagramie UML procesu uruchamiania, a odpowiednie części można streścić w następujący sposób:
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.
Dzieje się tak po utworzeniu modułu ładującego klasy Bootstrap silnika serwletu (Catalina).
Dzięki tym informacjom staje się jasne, że podczas procesu uruchamiania server.xml
plik jest analizowany, ale tak naprawdę nie odpowiada na pytanie, dlaczego należy ponownie uruchomić Tomcat, aby zastosować zmiany w tym pliku.
Odpowiedź jest taka, że pewną jego część można dynamicznie modyfikować w środowisku wykonawczym za pomocą JMX . Aby było to możliwe, konieczne było zarejestrowanie odpowiedniego komponentu MBean (krok b6 powyżej), a także zaakceptowanie operacji SET (niektóre komponenty MBean mają tylko interfejs GET).
W twoim konkretnym przypadku nie ma możliwości utworzenia i zarejestrowania nowego hosta w czasie wykonywania, ponieważ nie ma na to żadnego przepisu, i to jest powód, dla którego musisz zrestartować proces Tomcat, aby moduł ładujący klasy Bootstrap utworzył instancję tego obiektu i zarejestrował go w Agent JMX.
Następnie możliwe jest zmodyfikowanie tego hosta za pomocą klienta JMX, takiego jak jconsole
dostarczany w pakiecie z dowolnym pakietem JDK.
Połącz jconsole
się z Tomcat obsługującym JMX i przejrzyj komponent MBean hosta, aby sprawdzić wszystkie dostępne atrybuty:
i sprawdź wszystkie dostępne operacje (jedna z nich pokazana poniżej jako przykład):