ทำไม Tomcat ถึงชอบลบไฟล์ context.xml ของฉัน


24

ฉันกำลังพัฒนาแอปพลิเคชัน Java ที่ทำงานบนเว็บและ (แน่นอน) ต้องเปิดใช้งานในพื้นที่ระหว่างการพัฒนา ฉันพบเอกสาร Tomcat และมีไฟล์ context.xml ที่เหมาะสม/etc/tomcat6/Catalina/localhost/แต่บ่อยครั้งที่ Tomcat ตัดสินใจลบมัน! ซึ่งหมายความว่าฉันต้องใส่มันกลับมาและรีสตาร์ท Tomcat

ทำไมถึงทำเช่นนี้? ฉันได้ค้นหาเอกสาร Tomcat เกี่ยวกับเรื่องนี้แล้วและไม่มีใครฉลาด

(โอ้ใช่: มันไม่ได้เรียกจริงcontext.xmlแต่owners.xmlเป็นเพราะนั่นคือคำนำหน้าเส้นทาง HTTP สำหรับแอปพลิเคชันนี้)

ปรับปรุง

ฉันเห็น Tomcat ลบไฟล์ขณะที่ Tomcat ทำงานอยู่ ฉันคิดว่าฉันต้องส่งไฟล์บั๊ก ...


มีปัญหานี้กับ ดูเหมือนว่าเมื่อคุณแทนที่สงครามของคุณมันทำให้เกิดการเลิกใช้งานแอพซึ่งทำให้เกิดการลบไฟล์บริบท ฉันไม่มีการทำงาน แต่อยากจะมีที่สะดวกกว่า reloadable = false stackoverflow.com/questions/4032773/…
artemb

คำตอบ:


18

สรุปอย่างรวดเร็ว : มีหลายเงื่อนไข (เช่นการเปลี่ยนไฟล์ war, ลบ webapp หรือแทนที่ด้วยเนื้อหาใหม่) ซึ่ง tomcat จะยกเลิกการปรับใช้บริบทรวมถึงการลบไฟล์บริบท

รายละเอียด : ไม่ว่าจะเป็นแมวตัวผู้หรือไม่ทำ autoDeployment (หมายถึงการตรวจสอบการเปลี่ยนแปลงในคำอธิบาย. xml ของคุณเช่นเดียวกับการตรวจสอบการเปลี่ยนแปลงในไดเรกทอรี webapp) โดย:

  1. server.xml localted ในส่วนของ $ CATALINA_HOME / conf / server.xml:

    <Host name = "localhost" appBase = "webapps" unpackWARs = "true" autoDeploy = "true" xmlValidation = "false" xmlNamespaceAware = "false">

  2. คุณยังสามารถตั้งค่าคุณสมบัตินี้ในไฟล์บริบทของคุณมากเกินไปค่า

การอ้างอิงเอกสารสำหรับกรณีต่างๆเมื่อautoDeploy = trueอาจทำให้ไฟล์บริบทของคุณถูกลบ:

  • การลบไฟล์ WAR จะทริกเกอร์การยกเลิกการปรับใช้แอปพลิเคชันด้วยการลบไดเรกทอรีที่ขยายออกใด ๆ ที่เกี่ยวข้องไฟล์บริบทและไดเรกทอรีงาน
  • การลบไดเรกทอรีจะก่อให้เกิดการยกเลิกการปรับใช้แอปพลิเคชันด้วยการลบไฟล์บริบทที่เกี่ยวข้องและไดเรกทอรีงาน
  • การอัพเดตไฟล์ WAR จะทริกเกอร์การยกเลิกการปรับใช้แอปพลิเคชันด้วยการลบไดเรกทอรีที่ขยายออกใด ๆ ที่เกี่ยวข้องไฟล์บริบทและไดเรกทอรีงาน
  • การอัพเดตไดเร็กทอรี (ไม่ใช่เนื้อหาไดเร็กทอรี) จะทริกเกอร์การยกเลิกการปรับใช้แอ็พพลิเคชันพร้อมกับการลบไฟล์บริบทที่เกี่ยวข้องและไดเร็กทอรีงาน

รายละเอียดครบถ้วนสมบูรณ์ : http://tomcat.apache.org/tomcat-6.0-doc/config/host.html#Automatic%20Application%20Deployment


นี่ไม่ใช่คำตอบที่สมบูรณ์ - โปรดดูserverfault.com/faq#deletion
Jenny D กล่าวว่า Reinstate Monica

:) โปรดช่วยตัวเอง (ดูเหมือนว่าเน้นไวยากรณ์การทำงานที่แตกต่างกันกว่าใน StackOverflow เล็กน้อยซึ่งลบส่วนหนึ่งของคำตอบก่อน)
ม.ค. Zyka

สิ่งคือถ้าคุณเพิ่งเพิ่มลิงค์เป้าหมายของลิงก์อาจหายไปทำให้คำตอบไร้ประโยชน์ นั่นเป็นเหตุผลที่ serverfault.com สนับสนุนให้คุณโพสต์คำตอบจริงแทนที่จะเป็นแค่ลิงค์ และเมื่อฉันแสดงความคิดเห็นข้อความที่เหลือก็ไม่ปรากฏ ฉันยังคงแนะนำให้โพสต์คำตอบที่สมบูรณ์มากกว่าเดิมโดยสังเขปของลิงก์
Jenny D พูดว่า Reinstate Monica

1
นั่นไม่ใช่ความจริง คำตอบเดิมที่มี (และยังคง) สรุปสั้น ๆ ของสิ่งที่คุณสามารถหาได้ภายใต้ลิงค์ หากไม่มีลิงก์คำตอบก็ยังคงสมเหตุสมผลและพร้อมกับลิงก์ที่คุณสามารถหารายละเอียดได้
Jan Zyka

แต่ฉันไม่ได้วางแผนที่จะก้าวร้าวดังนั้นขอโทษถ้ามันฟังดูเป็นอย่างนั้น :) ฉันไม่ได้เข้าสู่เว็บนี้มากนักเพียงแค่แก้ไขแบบเดียวกันและต้องการแบ่งปัน
Jan Zyka

5

หากคุณไม่ต้องการฟีเจอร์ autoDeployในสภาพแวดล้อมการใช้งานจริงคุณอาจพิจารณาคุณลักษณะต่อไปนี้ในไฟล์บริบท conf / Catalina / localhost:

  • autoDeploy = "false"
  • และ deployXML = "false"

autoDeploy = "false" อาจไม่ทำงานคนเดียวเพราะแอปพลิเคชัน context.xml (ใน META-INF) สามารถแทนที่การตั้งค่า server.xml ของ autoDeploy

  • META-INF / context.xml ของแอปพลิเคชันจะถูกใช้ในสภาพแวดล้อมการพัฒนาด้วย autoDeploy
  • บริบท conf / Catalina / localhost ในการผลิตโดยไม่มี autoDeploy

เอกสารประกอบของแอตทริบิวต์เอกสารประกอบของ attributeXML นั้นมีค่าที่ควรอ่าน (Implement การปฏิบัติตามมาตรฐาน)

หมดจดกรณีที่ผู้ใช้ autoDeploy และเมื่อบริบทจะถูกลบออก: แอพลิเคชันเช่น undeployed, กรณีที่ผู้ใช้เป็นเอกสารที่สามารถพบได้ที่นี่


2

ลาดเทตอบเล็กน้อยทำไม

อย่างไรก็ตามลิงค์นี้ระบุว่าคุณสามารถหยุดสิ่งนี้ได้โดยตั้งค่าautoDeploy="false"ในserver.xml


1
ภายใต้ tomcat7 autoDeploy = "false" ไม่ได้สร้างความแตกต่าง :(
Joseph Lust

1

ฉันไม่รู้ว่าอะไรคือเหตุผลที่ทำให้ Tomcat ทำเช่นนี้ แต่ลองเพิ่มแอตทริบิวต์ XML ต่อไปนี้ไปยังองค์ประกอบบริบทของคุณ

reloadable="false"

ดังนั้นบริบทของคุณอาจมีลักษณะเช่นนี้:

<Context path="/" docBase="/some/path/name" reloadable="false">
<!-- Context related stuff -->
</Context>

นี่จะเป็นการป้องกันไม่ให้ Tomcat ลบไฟล์


น่าเสียดายที่ทำให้การพัฒนายากขึ้นเนื่องจากฉันต้องเริ่มต้น Tomcat ใหม่หลังจากแต่ละบิลด์
staticsan

ชำระเงิน jrebel เพื่อช่วยในการพัฒนานี้: zeroturnaround.com/jrebel
harmanjd

0

ฉันรู้ว่านี่เป็นเธรดเก่า แต่ฉันคิดว่าฉันจะแบ่งปันสิ่งที่ฉันพบเพื่อแก้ไขปัญหานี้ ...

ฉันเคยมีปัญหาเดียวกันกับไฟล์ context.xml ของฉันสำหรับ Tomcat เวอร์ชันเดสก์ท็อปของฉันที่ถูกบล็อกทุกครั้งที่ฉันจะปรับใช้สำเนาไฟล์สงครามใหม่สำหรับแอปพลิเคชันของฉัน

ปัญหาเกิดจากการที่ฉันทำการเปลี่ยนแปลงไฟล์นี้โดยตรงบนระบบไฟล์ สิ่งที่แก้ไขปัญหาได้คือการแก้ไขไฟล์ context.xml ผ่านทางตัวแก้ไข Eclipse ของฉัน ภายใน Eclipse ของฉันมีโครงการ "เซิร์ฟเวอร์" ที่เมื่อคุณขยายคุณจะเห็นไฟล์จำนวนมากเช่น context.xml และ server.xml ปรากฏว่าหากคุณแก้ไขไฟล์จากที่นี่แทนที่จะออกไปที่ระบบไฟล์การเปลี่ยนแปลงของคุณจะถูกเก็บไว้

ฉันพบโซลูชันนี้ในชุดข้อความต่อไปนี้: https://www.liferay.com/community/forums/-/message_boards/message/16511799

ฉันหวังว่านี่จะช่วยคนอื่นได้!

-StephenS


0

ปัญหาทั่วไปตามที่อธิบายโดยชื่อเรื่องครอบคลุมโดยการปรับใช้ใหม่จากสงครามโดยไม่ต้องลบบริบทซึ่งยังคงเป็นปัญหาที่เปิดอยู่ในขณะนี้

มีความแตกต่างที่ยอมรับระหว่างการปรับใช้ซ้ำซึ่งไม่ได้ลบบริบทและการปรับใช้หลังจากยกเลิกการปรับใช้ที่การยกเลิกการปรับใช้ลบบริบท เอกสารประกอบล้าสมัยและ GUI ของผู้จัดการยังไม่รองรับการปรับใช้อีกครั้ง


-1

บางครั้งจำเป็นต้องมีค่าที่แตกต่างกันสำหรับแอปในเซิร์ฟเวอร์เช่นพา ธ เพื่อจัดเก็บไฟล์ที่อัปโหลด ในสภาพแวดล้อมของนักพัฒนาเรามีสิ่งนี้:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/ParkMeServer" allowCasualMultipartParsing="true" reloadable="false">
     <Parameter name="rutaTrabajo" value="C:\Larry\Proyectos\app\rutaTrabajoxx" override="true"/>
</Context>

แต่ในเซิร์ฟเวอร์เส้นทางแตกต่างกัน:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/ParkMeServer" allowCasualMultipartParsing="true" >
     <Parameter name="rutaTrabajo" value="/usr/share/App/rutaTrabajo" override="true"/>
</Context>

ฉันยังมีปัญหาเดียวกัน Tomcat ลบ context.xml (meapp.xml) จาก conf / Catalina / localhost

เพื่อแก้ปัญหาฉันใช้ context.xml.default ในพา ธ เดียวกันฉันสร้างไฟล์ชื่อ context.xml.default และภายใน config ที่ฉันต้องการเก็บไว้:

 cat context.xml.default
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/ParkMeServer" allowCasualMultipartParsing="true" >
     <Parameter name="rutaTrabajo" value="/usr/share/ParkiMeApp/rutaTrabajo" override="true"/>
</Context>

ดังนั้นเมื่อปรับใช้ใหม่แล้วแอปพารามิเตอร์ยืนยันยังคงอยู่ที่นั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.