在Tomcat中编辑“server.xml”而不重启服务器?

我在Tomcat 8的conf文件夹中编辑了“server.xml”文件。 我为一个新的网站添加了一个新的Host标签。

我必须重新启动Tomcat服务器吗?

我可以让Tomcatparsing并应用新编辑的server.xml吗?

我会开始说这个问题并不是完全正确的,因为在不重新启动Tomcat的情况下实际编辑文件是完全可能的,但是这些更改会被正在运行的进程忽略。

真正的问题是如何在不重启Tomcat的情况下在server.xml应用更改。

从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. 

这发生在servlet引擎(Catalina)的Bootstrap类加载器的创build之后。

有了这些信息,现在很明显,在启动过程中parsing了server.xml文件,但是它并没有真正回答为什么需要重新启动Tomcat以将更改应用到此文件的问题。

答案是可以使用JMX在运行时dynamic修改其中的一部分。 为了这个可能,相应的MBean必须被注册(上面的b6步骤),并且还必须接受SET操作(一些MBean只有一个GET接口)。

在你的具体情况下,在运行时没有办法创build和注册一个新的主机,因为没有提供它,这就是为什么你必须重新启动Tomcat进程来让Bootstrap类加载器实例化这个对象并注册它JMX代理。

之后,可以从JMX客户机(例如与任何JDK捆绑在一起的jconsole中修改该主机。

jconsole连接到启用了JMX的Tomcat并浏览Host MBean以检查所有可用的属性:

显示主机MBean的属性的jconsole

并检查所有可用的操作(其中一个如下所示为例):

jconsole在主机MBean上显示一个示例操作

不需要重新启动。

用于<Context>的Tomcat doc页面提到:

主conf / server.xml文件无法重新加载而不重启Tomcat。