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.
我首先要说这个问题并不完全正确,因为很有可能在不重新启动 Tomcat 的情况下实际编辑文件,但是正在运行的进程会忽略这些更改。
真正的问题是如何在
server.xml
不重新启动 Tomcat 的情况下应用更改。从启动过程和 Tomcat 在线文档上的类加载器页面收集信息,可以更详细地理解这一点。
更具体地说,它在serverStartup.txt中进行了描述,以及启动过程的UML 图和相关部分可以总结如下:
这发生在创建 servlet 引擎 (Catalina) 的 Bootstrap 类加载器之后。
有了这些信息,现在在启动过程中
server.xml
解析文件的时间就很清楚了,但它并没有真正回答为什么需要重新启动 Tomcat 才能将更改应用到该文件的问题。答案是它的某些部分可以在运行时使用 JMX动态修改。为此,必须注册适当的 MBean(上面的 b6 步骤),并且还必须接受 SET 操作(某些 MBean 只有 GET 接口)。
在您的特定情况下,无法在运行时创建和注册新主机,因为没有提供它,这就是您必须重新启动 Tomcat 进程以让 Bootstrap 类加载器实例化该对象并将其注册的原因JMX 代理。
之后,可以从 JMX 客户端(例如
jconsole
与任何 JDK 捆绑的客户端)修改该主机。将您连接
jconsole
到启用 JMX 的 Tomcat 并浏览 Host MBean 以检查所有可用属性:并检查所有可用的操作(其中一个如下所示):
否。需要重新启动。
<Context>
提及的 Tomcat 文档页面: