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