IntelliJ และ Tomcat …ไฟล์ที่เปลี่ยนแปลงจะไม่ถูกจดจำโดยอัตโนมัติโดย Tomcat


138

ฉันใช้งาน Intellij Ultimate กับ Tomcat และทำสงคราม ทุกอย่างปรับใช้กับไดเร็กทอรี webapp ของ tomcat

เมื่อฉันเปลี่ยนไฟล์เช่นไฟล์ xhtml มีวิธีที่ tomcat จะรับการเปลี่ยนแปลงนั้นโดยอัตโนมัติหรือไม่ ณ ตอนนี้ฉันต้องคัดลอกไฟล์จาก Intellij และคัดลอกไปยังไดเร็กทอรีที่อยู่ในไดเร็กทอรีเว็บแอป tomcat ฉันรู้ว่ามีไฟล์บางไฟล์ที่ต้องคอมไพล์ใหม่ แต่ xhtml ไม่ใช่ไฟล์ใดไฟล์หนึ่ง

คำตอบ:


22

ให้ฉันอธิบายลำดับของการกระทำโดยใช้ภาพหน้าจอ:

  1. เปิดการกำหนดค่า Tomcat Run / Debug ของคุณ (เรียกใช้> แก้ไขการกำหนดค่า)

ป้อนคำอธิบายภาพที่นี่

  1. คลิกไอคอนเพิ่มเลือก "สิ่งประดิษฐ์" จากนั้นเลือกpizza_mvc:war exploded: ป้อนคำอธิบายภาพที่นี่

  2. แก้ไข 'On update action' และ 'On frame diactivation': ป้อนคำอธิบายภาพที่นี่

  3. ทุกครั้งที่คุณต้องการรีเฟรชทรัพยากรของคุณให้กด <Ctrl> + F10


ขอขอบคุณที่เตือนให้ตรวจสอบการดำเนินการ "เปิด" อัปเดต "
km1

292

สิ่งนี้ไม่สามารถทำได้หากคุณปรับใช้สงครามกับ IntelliJ IDEA แต่ก็สามารถเป็นถ้าคุณปรับใช้สงครามระเบิด ใน IDEA:

  1. เปิดการกำหนดค่า Tomcat Run / Debug ของคุณ ( เรียกใช้> แก้ไขการกำหนดค่า )
  2. ไปที่แท็บ "การทำให้ใช้งานได้"
  3. ในส่วน "Deploy at Server Startup" ให้ลบอาร์ติแฟกต์ (ถ้ามี) ออก my-webapp-name:war
  4. คลิกไอคอนเพิ่มเลือก "สิ่งประดิษฐ์" จากนั้นเลือก my-webapp-name:war exploded
  5. คลิกตกลง (ในกล่องโต้ตอบ "เลือกสิ่งประดิษฐ์เพื่อปรับใช้")
  6. ยังคงอยู่ในหน้าต่าง Run / Debug Configuration เลือกแท็บ "Server"
  7. ตรงกลางของแท็บนั้นให้เปลี่ยนการตั้งค่า "On frame Deactivation" เป็น "Update resources" หรือ "Update Classes and Resources"
    • อัปเดตทรัพยากร: ทรัพยากรที่เปลี่ยนแปลงทั้งหมด (นั่นคือส่วนประกอบของแอปพลิเคชันทั้งหมดนอกเหนือจากคลาส) จะถูกอัปเดต
    • อัปเดตคลาสและทรัพยากร:ทรัพยากรที่เปลี่ยนแปลงทั้งหมดจะได้รับการอัปเดต ชั้นเรียนที่เปลี่ยนแปลงจะถูกคอมไพล์ใหม่ โปรดทราบว่าจะมีการอัปเดตคลาสจริงหรือไม่นั้นขึ้นอยู่กับความสามารถของเว็บเซิร์ฟเวอร์ ถ้าฉันจำได้ Tomcat จะโหลดไฟล์ html / xhtml และ jsp ซ้ำ แต่ไม่ใช่ Servlets หรือคลาสที่ JSPs หรือ Servlets ใช้ คุณต้องแก้ไข Tomcat เพื่อใช้ตัวโหลดคลาสแบบไดนามิกสำหรับสิ่งนั้น
  8. คุณยังสามารถตั้งค่าการดำเนินการ " เปิด" อัปเดต "ตามที่เลือกไว้ด้านบนได้เช่นกัน
    • สิ่งนี้กำหนดว่าจะเกิดอะไรขึ้นเมื่อคุณกดอัปเดตไอคอนไอคอนอัปเดต(หรือCtrl+ F10) ในหน้าต่างเรียกใช้
    • "แสดงกล่องโต้ตอบ" กำหนดว่า IDEA จะแจ้งให้คุณทราบทุกครั้งที่คุณกดไอคอนอัปเดต
  9. คลิกตกลง

เมื่อใดก็ตามที่คุณทำการเปลี่ยนแปลง IDEA จะปรับใช้ไฟล์ที่เปลี่ยนแปลงอีกครั้งเมื่อเฟรมของ IDEA ถูกปิดใช้งาน (เช่นสูญเสียโฟกัส) ใช้เวลา 1-2 วินาทีคุณจะเห็นในแถบสถานะด้านล่างใน IDEA เห็นได้ชัด. คุณยังคงต้องรีเฟรชเว็บเบราว์เซอร์ของคุณเพื่อดึงไฟล์ใหม่ (เว้นแต่แน่นอนว่าหน้านั้นมีการรีเฟรช ajax อัตโนมัติเช่นการดึงข้อมูล)

การผสมผสานที่ดีกับ Tomcat คือการตั้งค่า "On frame deactivation" เป็น "Update Resources" และการดำเนินการ "On" update "เป็น" Redeploy "หรือ" Restart Server "ซึ่งช่วยให้สามารถอัปเดตเพจแบบคงที่ได้อย่างรวดเร็วผ่านการปิดใช้งานเฟรมและ คลาสที่อัปเดตผ่านการดำเนินการ "อัปเดต"

บริษัท ชื่อ ZeroTurnaround ขายJRebelซึ่งเป็นโซลูชันไดนามิกคลาสโหลดเดอร์ พวกเขายังมีซีรีส์ห้าตอนในเรื่องที่ดีมาก


ฉันมีข้อผิดพลาด: Error: Artifact 'my-webapp-name:war exploded' has invalid extensionจะแก้ไขได้อย่างไร?
Anton Dozortsev

3
ฉันขอแนะนำอย่างยิ่งให้ใช้ DCEVM สำหรับการโหลดคลาสอัตโนมัติ จากนั้นคุณสามารถใช้ "อัปเดตคลาสและทรัพยากร" เพื่อใช้การเปลี่ยนแปลงกับซอร์สโค้ดโดยไม่ต้องปรับใช้แอปพลิเคชันใหม่ ดู: blog.jetbrains.com/idea/2013/07/… . นอกเหนือจากสิ่งที่บทช่วยสอนนี้อธิบายแล้วจำเป็นต้องตั้งค่า JAVA_HOME ในแท็บการตั้งค่า / การเชื่อมต่อ - ดีบักของ Tomcat Run Configuration เพื่อชี้ไปที่ JRE ของ DCEVM
Alex Fedulov

1
@yaroslavprokipchyn - ฉันไม่คุ้นเคยกับ JBoss และข้อกำหนด 'พิเศษ' ใด ๆ ที่อาจมี แต่เท่าที่ฉันรู้มันควรจะทำงานเหมือนกัน สำหรับ tomcat IDEA จะสร้างการกำหนดค่า Tomcat (context.xml) ที่บอกให้ Tomcat ใช้ไดเร็กทอรี target / {contextName} เป็นไดเร็กทอรี root ของ webapp คุณอาจต้องการตรวจสอบคู่มือช่วยเหลือสำหรับข้อมูลเฉพาะของ JBOss
Javaru

3
ในขั้นตอนที่ 7 คุณจะไม่ (อย่างน้อยใน Intellij 14) ได้รับตัวเลือกแบบเลื่อนลงที่เหมาะสมเว้นแต่คุณจะโหลดอาร์ติแฟกต์ทั้งหมดเป็น "ระเบิด"
mortensi

1
@ChiefTwoPencils - ขั้นตอนที่ 5 คือคลิกตกลงบนกล่องโต้ตอบ "Select Artifacts to Deploy" (ซึ่งไม่มี "ใช้") ไม่ใช่หน้าต่างการกำหนดค่า Run / Debug ฉันเพิ่มข้อความชี้แจงในขั้นตอนที่ 5
Javaru

12

หากคุณต้องการที่จะเรียนปรับปรุงและทรัพยากรเรียกใช้Tomcatในโหมดการตรวจแก้จุดบกพร่อง ในโหมดนี้IntelliJอัพเดตคลาสและทรัพยากรโดยไม่มีปัญหา (hot swap)

มีปัญหาเดียวกัน IntelliJไม่ได้อัปเดตโปรเจ็กต์ของฉันเพราะฉันเรียกใช้เป็น "โหมดเรียกใช้" เมื่อฉันทำงานในโหมดดีบักและกดCtrl+ F10มันจะอัปเดตคลาสและทรัพยากร


Control-F10 แก้ไขปัญหาให้ฉัน ขอบคุณ!
Jeffrey Getzin

3

ฉันได้พบวิธีที่ดีกว่า

ในEclipseเราได้สร้างโดยอัตโนมัติคอมไพล์ + โหลดไฟล์คงที่ซ้ำ ที่จริงแล้วไฟล์คงมีให้บริการโดยตรงจากsrc / main / webapp

ในIntelliJแทนที่จะให้บริการโดยตรงจากsrc / main / webappจะมีโฟลเดอร์ที่สร้างขึ้นในเป้าหมายซึ่งคุณจะมีสำเนาsrc / main / webapp ของคุณและบริบทอื่น ๆ ที่เกี่ยวข้อง .. web-inf / class / lib

หากคุณใส่ผลลัพธ์ของสิ่งประดิษฐ์ที่ระเบิดไปยังsrc / main / webappแทนเป้าหมายมันจะไม่เขียนทับไฟล์ต้นฉบับของคุณและจะให้บริการโดยตรงคุณจะไม่ต้องตี - อัปเดตทรัพยากร / อัปเดตทรัพยากรและคลาส

ดังนั้นสิ่งที่คุณต้องทำใน IntelliJ คือ

  1. แก้ไขไดเร็กทอรีเอาต์พุตอาร์ติแฟกต์ที่ระเบิดเป็น src / main / webapp ป้อนคำอธิบายภาพที่นี่
  2. สร้างมาโครสำหรับบันทึกและคอมไพล์ / คอมไพล์คลาสสกปรก (cmd + shift + f9) ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่
  3. แก้ไขรีจิสทรีและการตั้งค่าเพื่อสร้างโดยอัตโนมัติและสร้างในขณะที่แอปทำงาน (cmd + shift + a - รีจิสตรี) ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่

หลังจากนี้หากคุณมีงานที่เปลี่ยนไฟล์คงที่จากภายนอก IntelliJ คุณจะเห็นการเปลี่ยนแปลงทันทีโดยไม่ต้องไปที่ IntelliJ และ Update Resourcesและสำหรับคลาสคุณมีมาโครที่บันทึกและคอมไพล์ (หมายเหตุ: คุณสามารถกด Compile ได้ด้วย / คอมไพล์ใหม่: cmd + shift + F9 / cmd + F9 - หากคุณมีเครื่องมือแก้ไขที่เปิดไว้หลายตัวจะเห็นว่าตัวแก้ไข * สกปรกของคุณจะไม่สกปรกและการเปลี่ยนแปลง (คลาส) จะถูกโหลดซ้ำ)


ดูเหมือนว่าถ้าคุณมีรีจิสทรี compiler.automake .. เปิดใช้งานมันจะผลักการเปลี่ยนแปลงของคุณโดยการกดบันทึกเท่านั้น
Radu Toader

0

จะเป็นไปได้ก็ต่อเมื่อคุณปรับใช้โฟลเดอร์ Explosion war เปิดใช้งานการรีโหลดแบบร้อนและเริ่ม tomcat ในโหมดดีบัก

นี่คือขั้นตอนในการบรรลุเป้าหมายนี้

  1. เปิดการกำหนดค่า Tomcat Run / Debug ของคุณ (เรียกใช้> แก้ไขการกำหนดค่า)
  2. ไปที่แท็บ "Deployment" 3 ในส่วน "Deploy at Server Startup" ลบ (ถ้ามี) อาร์ติแฟกต์ my-webapp-name: war
  3. คลิกไอคอนเพิ่มเลือก "สิ่งประดิษฐ์" จากนั้นเลือก my-webapp-name: war ระเบิด
  4. คลิกตกลง (ในกล่องโต้ตอบ "เลือกสิ่งประดิษฐ์เพื่อปรับใช้")
  5. ยังคงอยู่ในหน้าต่าง Run / Debug Configuration เลือกแท็บ "Server"
  6. เปลี่ยนการตั้งค่า "On frame Deactivation" และ "On Update Action" เป็น "Update class and resources"
  7. สมัครและบันทึก
  8. ไปที่การตั้งค่าโครงการปกติโดยคลิกไฟล์แล้วคลิกการตั้งค่าหรือกด CTRL + ALT + S
  9. ไปที่ "Build, Execution, Deployment"
  10. คอมไพเลอร์
  11. เลือกสร้างโครงการโดยอัตโนมัติ
  12. บันทึก
  13. เริ่ม Tomcat ในโหมด debug

0

หากคุณมีไฟล์หลายส่วนที่คุณต้องการดู / เล่นทันทีให้อัปโหลดลงในโฟลเดอร์เป้าหมายโดยตรง * (เปลี่ยนเฉพาะตำแหน่งการเขียนไปยังโฟลเดอร์เป้าหมาย / แบบคงที่ /)

String yourpath = C\\andSoForth
    yourPath + "\\target\\classes\\static\\uploads\\audiofiles\\"

คุณจะสามารถดูไฟล์ของคุณได้ทันทีโดยไม่ต้องรีสตาร์ท IDE

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