ฉันจะเริ่มต้นด้วยการพูดว่าคำถามนั้นไม่ได้ถูกต้องสมบูรณ์เพราะมันเป็นไปได้ที่จะแก้ไขไฟล์โดยไม่ต้องเริ่มต้น 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 classloader ของโปรแกรม servlet (Catalina)
ด้วยข้อมูลนี้มันชัดเจนตอนนี้เมื่ออยู่ในขั้นตอนการเริ่มต้นserver.xml
ไฟล์จะถูกแจง แต่มันก็ไม่ได้ตอบคำถามที่ว่าทำไมจึงต้องเริ่มต้น Tomcat ใหม่เพื่อใช้การเปลี่ยนแปลงกับไฟล์นี้
คำตอบก็คือบางส่วนหนึ่งของมันสามารถปรับเปลี่ยนได้แบบไดนามิกที่รันไทม์ใช้ JMX เพื่อให้เป็นไปได้ต้องมีการลงทะเบียน MBean ที่เหมาะสม (ขั้นตอน b6 ด้านบน) และต้องยอมรับการดำเนินการของ SET (MBeans บางตัวมีอินเตอร์เฟส GET เท่านั้น)
ในกรณีเฉพาะของคุณไม่มีวิธีในการสร้างและลงทะเบียนโฮสต์ใหม่ที่รันไทม์เนื่องจากไม่มีข้อกำหนดสำหรับมันและนี่คือเหตุผลที่คุณต้องเริ่มต้นกระบวนการ Tomcat ใหม่เพื่อให้ Bootstrap classloader สร้างอินสแตนซ์วัตถุนั้นและลงทะเบียนด้วย เอเจนต์ JMX
หลังจากนั้นเป็นไปได้ที่จะปรับเปลี่ยนโฮสต์นั้นจากไคลเอนต์ JMX เช่นjconsole
ที่มาพร้อมกับ JDK ใด ๆ
เชื่อมต่อคุณjconsole
กับ Tomcat ที่เปิดใช้งาน JMX และเรียกดู Host MBean เพื่อตรวจสอบแอตทริบิวต์ที่มีอยู่ทั้งหมด:
และตรวจสอบการดำเนินการทั้งหมดที่มี (หนึ่งในนั้นแสดงด้านล่างเป็นตัวอย่าง):