นี่คือหน้าภาพรวม โปรดไปที่ hotswapagent.org สำหรับข้อมูลเพิ่มเติม
คลาสรันไทม์ไม่จำกัดของ Java และการกำหนดทรัพยากรใหม่
เป้าหมายหลักของโครงการนี้คือเพื่อขจัดความจำเป็นในการใช้วงจรการพัฒนาแบบ "เปลี่ยนโค้ด -> รีสตาร์ทและรอ... -> ตรวจสอบ" เมื่อเวลาผ่านไป แนวคิดนี้ได้พัฒนาไปสู่กระบวนทัศน์ใหม่ภายในระบบนิเวศของ Java ซึ่งช่วยให้สามารถพัฒนาซอฟต์แวร์แบบเรียลไทม์ภายในแอปพลิเคชันที่ทำงานอยู่ได้ วิธีการนี้ยังทำได้ในสภาพแวดล้อมที่จำกัด เช่น คอนเทนเนอร์ Docker
หากคุณเป็นผู้ใช้ IntelliJ คุณสามารถทำให้การตั้งค่า HA และ DCEVM ง่ายขึ้นได้โดยใช้ปลั๊กอิน IntelliJ HotSwapHelper
ดาวน์โหลดและติดตั้ง:
สำหรับ Java 17/21: ดาวน์โหลด JBR17 หรือ JBR21 ล่าสุด เนื่องจากเวอร์ชันเหล่านี้ไม่มี Hotswap Agent ในตัว คุณจะต้องคัดลอก hotswap-agent.jar
ไปยังโฟลเดอร์ lib/hotswap
ด้วยตนเอง คุณสามารถค้นหา Hotswap Agent ล่าสุดได้ที่นี่ ตรวจสอบให้แน่ใจว่าไฟล์ในโฟลเดอร์ lib/hotswap
ชื่อ hotswap-agent.jar
โดยไม่มีหมายเลขเวอร์ชันในชื่อไฟล์
สำหรับ Java 11: ใช้ TravaJDK ซึ่งมี HotswapAgent ในตัว และติดตั้งเป็น JDK สำรอง TravaJDK มี HotswapAgent ในตัวด้วย
สำหรับ Java 8: ใช้ jdk8-dcevm พร้อมกับ HotswapAgent
โหมด HotswapAgent:
เริ่มต้นด้วย dcevm-11.0.9
HotswapAgent จะถูกปิดใช้งานตามค่าเริ่มต้น คุณสามารถเปิดใช้งานการสนับสนุน HotswapAgent โดยใช้ตัวเลือก JVM ในหนึ่งในสามโหมด:
โหมด HotswapAgent=core
ทำงานโดยไม่ต้องใช้ปลั๊กอินเพิ่มเติม ยกเว้นปลั๊กอิน JVM หลัก ส่งผลให้ประสิทธิภาพเร็วขึ้นเนื่องจากการสแกนและการคัดลอกคลาสลดลง หากต้องการใช้ปลั๊กอินเพิ่มเติม คุณต้องกำหนดค่าปลั๊กอินดังกล่าวเป็นการพึ่งพา Maven ในไฟล์ pom.xml
ของคุณ ในทางกลับกัน โหมด HotswapAgent=fatjar
จะรวมปลั๊กอินทั้งหมดตามค่าเริ่มต้น ซึ่งอาจทำให้การเริ่มต้นแอปพลิเคชันช้าลงเล็กน้อย
-XX:HotswapAgent=fatjar
เปิดใช้งาน fatjar HotswapAgent ภายใน
-XX:HotswapAgent=core
เปิดใช้งาน HotswapAgent แกนภายในภายใน
-XX:HotswapAgent=external
กำหนดค่าการสนับสนุน JVM สำหรับ HotswapAgent และอนุญาตให้ผู้ใช้จัดหา hotswap-agent.jar
ภายนอกโดยใช้อ็อพชัน -javaagent:
3.การเปิดตัว:
Java17/21: เปิดแอปพลิเคชันของคุณด้วยตัวเลือก -XX:+AllowEnhancedClassRedefinition -XX:HotswapAgent=fatjar
เพื่อเปิด hotswap ขั้นสูง (dcevm) และใช้ Hotswap Agent fatjar release ในฐานะที่เป็น core
ทางเลือกหรือโหมด external
สามารถนำมาใช้แทน fatjar
ได้
Java11: เปิดแอปพลิเคชันของคุณด้วยตัวเลือก -XX:HotswapAgent=fatjar
เพื่อใช้ Hotswap Agent fatjar release
Java8: เปิดแอปพลิเคชันของคุณด้วยตัวเลือก -XXaltjvm=dcevm -javaagent:hotswap-agent.jar
เพื่อรับการตั้งค่าพื้นฐาน คุณสามารถเลือกเพิ่ม hotswap-agent.properties
ให้กับแอปพลิเคชันของคุณเพื่อกำหนดค่าปลั๊กอินและลักษณะการทำงานของตัวแทนได้
3. เรียกใช้แอปพลิเคชันของคุณ:
เริ่มแอปพลิเคชันในโหมดแก้ไขข้อบกพร่อง ตรวจสอบว่าเอเจนต์และปลั๊กอินเริ่มต้นอย่างถูกต้อง:
HOTSWAP AGENT: 9:49:29.548 INFO (org.hotswap.agent.HotswapAgent) - Loading Hotswap agent - unlimited runtime class redefinition. HOTSWAP AGENT: 9:49:29.725 INFO (org.hotswap.agent.config.PluginRegistry) - Discovered plugins: [org.hotswap.agent.plugin.hotswapper.HotswapperPlugin, org.hotswap.agent.plugin.jvm.AnonymousClassPatchPlugin, org.hotswap.agent.plugin.hibernate.HibernatePlugin, org.hotswap.agent.plugin.spring.SpringPlugin, org.hotswap.agent.plugin.jetty.JettyPlugin, org.hotswap.agent.plugin.tomcat.TomcatPlugin, org.hotswap.agent.plugin.zk.ZkPlugin, org.hotswap.agent.plugin.logback.LogbackPlugin] ... HOTSWAP AGENT: 9:49:38.700 INFO (org.hotswap.agent.plugin.spring.SpringPlugin) - Spring plugin initialized - Spring core version '3.2.3.RELEASE'
4.ตรวจสอบคำจำกัดความใหม่
บันทึกทรัพยากรที่เปลี่ยนแปลงและ/หรือใช้คุณสมบัติ HotSwap ของ IDE ของคุณเพื่อโหลดการเปลี่ยนแปลงอีกครั้ง
แต่ละเฟรมเวิร์กแอปพลิเคชัน (Spring, Hibernate, Logback, ...) จำเป็นต้องมีกลไกการโหลดซ้ำพิเศษเพื่อให้เป็นข้อมูลล่าสุดหลังจากการกำหนดคลาสใหม่ (เช่น การโหลดการกำหนดค่า Hibernate ใหม่หลังจากแนะนำคลาสเอนทิตีใหม่) เอเจนต์ Hotswap ทำงานเป็นระบบปลั๊กอินและได้รับการกำหนดค่าล่วงหน้าพร้อมกับปลั๊กอินเฟรมเวิร์กหลักทั้งหมด การเขียนปลั๊กอินแบบกำหนดเองของคุณเป็นเรื่องง่ายแม้จะเป็นส่วนหนึ่งของแอปพลิเคชันของคุณก็ตาม
โปรเจ็กต์นี้ซับซ้อนมากเนื่องจากมีเฟรมเวิร์กที่รองรับและเวอร์ชันต่างๆ มากมาย การมีส่วนร่วมของชุมชนเป็นสิ่งจำเป็นเพื่อรักษาชีวิตไว้ คุณสามารถเริ่มต้นด้วยการสร้างปลั๊กอินภายในแอปพลิเคชันของคุณ หรือโดยการเขียนตัวอย่าง/การทดสอบการรวมระบบ จำเป็นต้องมีการปรับปรุงเอกสารอยู่เสมอ :-) ขอบคุณสำหรับความช่วยเหลือ!
Java Hotswap ที่ปรับปรุงแล้ว - เปลี่ยนเนื้อหาวิธีการ เพิ่ม/เปลี่ยนชื่อวิธีการ ฟิลด์ ...การดำเนินการที่ไม่รองรับเพียงอย่างเดียวคือการเปลี่ยนซูเปอร์คลาส
คุณสามารถใช้ Java Hotswap มาตรฐานจาก IDE ในโหมดแก้ไขข้อบกพร่องเพื่อรีโหลดคลาสที่เปลี่ยนแปลง
หรือตั้งค่าคุณสมบัติ autoHotswap -XXaltjvm=dcevm -javaagent:PATH_TO_AGENThotswap-agent.jar=autoHotswap=true
เพื่อรีโหลดคลาสที่เปลี่ยนแปลงหลังจากการคอมไพล์ การตั้งค่านี้ช่วยให้สามารถโหลดซ้ำบนระบบที่ใช้งานจริงได้โดยไม่ต้องรีสตาร์ท
การกำหนดค่าอัตโนมัติ - คลาสและทรัพยากรในเครื่องทั้งหมด ซึ่งแอปพลิเคชัน Java ที่ทำงานอยู่รู้จัก จะถูกค้นพบและเฝ้าดูการโหลดซ้ำโดยอัตโนมัติ (ไฟล์ทั้งหมดบนระบบไฟล์ในเครื่อง ไม่ใช่ในไฟล์ JAR ใด ๆ)
classpath พิเศษ - ต้องการเปลี่ยนคลาสรันไทม์ภายใน JAR ที่ขึ้นต่อกันหรือไม่ ใช้คุณสมบัติ extraClasspath เพื่อเพิ่มไดเร็กทอรีใดๆ เป็น classpath เพื่อดูไฟล์คลาส
รีโหลดทรัพยากรหลังจากการเปลี่ยนแปลง - ทรัพยากรจากไดเร็กทอรี webapp มักจะถูกรีโหลดโดยแอปพลิเคชันเซิร์ฟเวอร์ แต่แล้วทรัพยากรอื่นๆ เช่น src/main/resources ล่ะ? ใช้คุณสมบัติ watchResources เพื่อเพิ่มไดเร็กทอรีใดๆ เพื่อดูการเปลี่ยนแปลงทรัพยากร
การสนับสนุนเฟรมเวิร์ก - ผ่านระบบปลั๊กอิน รองรับเฟรมเวิร์กจำนวนมาก สามารถเพิ่มปลั๊กอินใหม่ได้อย่างง่ายดาย
รวดเร็ว - จนกว่าปลั๊กอินจะเริ่มต้น จะไม่ใช้ทรัพยากรใดๆ หรือทำให้แอปพลิเคชันช้าลง (ดูค่าใช้จ่ายรันไทม์สำหรับข้อมูลเพิ่มเติม)
หากคุณมีปัญหาหรือคำถามใดๆ โปรดสอบถามที่ฟอรั่ม HotswapAgent
โครงการนี้คล้ายกับ JRebel ความแตกต่างที่สำคัญคือ:
HotswapAgent (DCEVM) รองรับ Java8, Java11 และ Java17!
HotswapAgent ไม่ต้องการการกำหนดค่าเพิ่มเติมใดๆ สำหรับการตั้งค่าโปรเจ็กต์พื้นฐาน
ปัจจุบัน JRebel เป็นผู้ใหญ่มากขึ้นและมีปลั๊กอินมากขึ้น
JRebel ไม่ใช่ทั้งโอเพ่นซอร์สหรือฟรี
JRebel แก้ไข bytecode ของคลาสทั้งหมดเมื่อรีโหลด คุณต้องมีปลั๊กอิน IDE พิเศษเพื่อแก้ไขข้อบกพร่อง
HotswapAgent extraClasspath คล้ายกับการกำหนดค่า JRebel
HotswapAgent เพิ่มการกำหนดค่า watchResources
ดูโปรเจ็กต์ HotswapAgentExamples GitHub วัตถุประสงค์ของแอปพลิเคชันตัวอย่างคือ:
ทำการทดสอบการรวมระบบอัตโนมัติที่ซับซ้อน (ตรวจสอบการกำหนดค่าต่างๆ ก่อนการเปิดตัว ดูที่สคริปต์ run-tests.sh
)
เพื่อตรวจสอบการใช้ปลั๊กอิน "โลกแห่งความเป็นจริง" ในระหว่างการพัฒนาปลั๊กอิน (เช่นภายในคอนเทนเนอร์)
เพื่อมอบโซลูชันการทำงานสำหรับการตั้งค่าแอปพลิเคชันทั่วไป
แซนด์บ็อกซ์เพื่อจำลองปัญหาสำหรับการตั้งค่าที่มีอยู่หรือการตั้งค่าใหม่
อย่าลังเลที่จะแยก/แยกและสร้างแอปพลิเคชันสำหรับการตั้งค่าของคุณ (ใช้งานได้จริง แต่ง่ายที่สุดเท่าที่จะทำได้) การตั้งค่าทั่วไปจะถูกรวมเข้ากับการตั้งค่าหลัก
ไม่จำเป็น :) จริงๆ! การเปลี่ยนแปลงทั้งหมดมีความโปร่งใส และสิ่งที่คุณต้องทำคือดาวน์โหลด patch+agent และตั้งค่าแอปพลิเคชัน/เซิร์ฟเวอร์แอปพลิเคชันของคุณ เนื่องจากเราใช้พฤติกรรม Java Hotswap มาตรฐาน IDE ของคุณจึงทำงานตามที่คาดไว้ อย่างไรก็ตาม เรากำลังพัฒนาปลั๊กอิน IDE เพื่อช่วยในการดาวน์โหลดและการกำหนดค่า
ปลั๊กอินบางตัวมีอยู่แล้ว:
เพิ่มสองการกระทำถัดจากปุ่ม "Debug" ใน Intellij, รันด้วย hotswap, ดีบักด้วย hotswap
เมื่อคลิกการกระทำ จะตั้งค่าพารามิเตอร์ vm ให้กับคุณ โดยไม่จำเป็นต้องตั้งค่าพารามิเตอร์ vm ด้วยตนเอง
ซอร์สโค้ดและเอกสารประกอบ: https://github.com/gejun123456/HotSwapHelper
การกำหนดค่าพื้นฐานได้รับการตั้งค่าให้รีโหลดคลาสและทรัพยากรจาก classpath ที่แอปพลิเคชันที่ทำงานอยู่รู้จัก (classloader) หากคุณต้องการคอนฟิกูเรชันอื่น ให้เพิ่มไฟล์ hotswap-agent.properties ไปที่รูท classpath (เช่น src/main/resources/hotswap-agent.properties
)
เอกสารรายละเอียดของคุณสมบัติที่มีอยู่และค่าเริ่มต้นสามารถพบได้ในไฟล์คุณสมบัติเอเจนต์
ไวยากรณ์ทั้งหมดของตัวเลือกบรรทัดคำสั่งคือ:
-javaagent:[yourpath/]hotswap-agent.jar=[option1]=[value1],[option2]=[value2]
ตัวแทน Hotswap ยอมรับตัวเลือกต่อไปนี้:
autoHotswap=true - ดูไฟล์ .class ทั้งหมดเพื่อการเปลี่ยนแปลงและ Hotswap คลาสในแอปพลิเคชันที่ทำงานอยู่โดยอัตโนมัติ (แทนที่จะเรียกใช้ Hotswap จากเซสชันการดีบัก IDE ของคุณ)
DisablePlugin=[pluginName] - ปิดการใช้งานปลั๊กอิน โปรดทราบว่าการดำเนินการนี้จะห้ามไม่ให้โหลดปลั๊กอินโดยสมบูรณ์ (ตรงข้ามกับการปิดใช้งานตัวเลือกปลั๊กอินใน hotswap-agent.properties ซึ่งจะปิดใช้งานปลั๊กอินสำหรับ classloader เท่านั้น คุณสามารถทำซ้ำตัวเลือกนี้สำหรับปลั๊กอินทุกตัวที่จะปิดใช้งาน
เพิ่มตัวเลือก vm -Dhotswapagent.disablePlugin=Spring,SpringBoot เพื่อปิดการใช้งานปลั๊กอิน ทำงานเหมือนกับตัวเลือกตัวแทนปิดการใช้งานปลั๊กอินในส่วนก่อนหน้า
เอเจนต์ Hotswap ทำหน้าที่รีโหลดทรัพยากรและการกำหนดค่าเฟรมเวิร์ก (Spring, Hibernate, ...) แต่ขึ้นอยู่กับกลไก Java hotswap มาตรฐานในการรีโหลดคลาส Java hotswap มาตรฐานอนุญาตให้เปลี่ยนเนื้อหาของวิธีการเท่านั้น ซึ่งทำให้ไม่สามารถใช้งานได้จริง DCEVM เป็นแพทช์ JVM (Hotspot) ที่อนุญาตให้เปลี่ยนคลาสโครงสร้างได้เกือบทั้งหมดบน hotswap (ยกเว้นการเปลี่ยนแปลงลำดับชั้น) แม้ว่าเอเจนต์ hotswap จะทำงานได้แม้กับ java มาตรฐาน แต่เราขอแนะนำให้ใช้ DCEVM (และบทช่วยสอนทั้งหมดใช้ DCEVM เป็น JVM เป้าหมาย)
Hotswap agent คือคอนเทนเนอร์ปลั๊กอินที่มีตัวจัดการปลั๊กอิน การลงทะเบียนปลั๊กอิน และบริการตัวแทนหลายอย่าง (เช่น เพื่อดูการเปลี่ยนแปลงคลาส/ทรัพยากร) ช่วยในงานทั่วไปและปัญหาการโหลดคลาส โดยจะสแกนคลาสพาธเพื่อหาคลาสที่มีคำอธิบายประกอบ @Plugin ฉีดบริการเอเจนต์ และลงทะเบียน hooks ที่รีโหลด การแก้ไขรันไทม์ bytecode นั้นจัดทำโดยไลบรารี javaasist
ปลั๊กอินที่ดูแลโดย Hotswap Agent มักจะเน้นที่เฟรมเวิร์กเฉพาะ ตัวอย่างเช่น ปลั๊กอิน Spring ใช้บริการ HA เพื่อ:
แก้ไขคลาส Spring ของรูทเพื่อรับบริบทของ Spring และเส้นทางการสแกนที่ลงทะเบียน
คอยดูการเปลี่ยนแปลงทรัพยากรบนเส้นทางการสแกน
คอยดู hotswap ของไฟล์คลาสภายในแพ็คเกจเส้นทางการสแกน
รีโหลดคำจำกัดความ bean หลังจากการเปลี่ยนแปลง
... และอีกมากมาย
CXF-JAXRS (3.x) - กำหนดทรัพยากร JAXRS ใหม่หลังจากกำหนดคลาสทรัพยากรใหม่ ปฏิเสธอินสแตนซ์อีกครั้งหากรวมเข้ากับ Spring และ CDI (Weld/OWB)
Deltaspike (1.x,2.x) - ข้อความ, ViewConfig, พื้นที่เก็บข้อมูล, การโหลดพร็อกซีซ้ำ การปฏิเสธถั่ว CDI ที่มีขอบเขตของ Deltaspike
ELResolver (2.x-5.x) (JuelEL, Appache Commons EL, Oracle EL 3.0) - ล้างแคช ELResolver เมื่อเปลี่ยนคลาส รองรับ hotswap สำหรับ #{...} นิพจน์
FreeMarker - ล้างแคชวิปัสสนาคลาส Apache Freemarker beans ในการเปลี่ยนแปลงคำจำกัดความของคลาส
Hibernate (3.x-6.x) - โหลดการกำหนดค่า Hibernate ใหม่หลังจากสร้าง/เปลี่ยนแปลงเอนทิตี
iBatis - โหลดการกำหนดค่า iBatis ใหม่
IDEA - รองรับการพัฒนา IntelliJ IDEA ใน IDEA
Jackson - ล้างแคชภายในของ Jackson เมื่อกำหนดคลาสใหม่
Jersey1 - รีโหลดคอนเทนเนอร์ Jersey1 หลังจากทรัพยากรรูทหรือคำจำกัดความคลาสผู้ให้บริการหรือการกำหนดใหม่
Jersey2 - รีโหลดคอนเทนเนอร์ Jersey2 หลังจากทรัพยากรรูทหรือคำจำกัดความคลาสผู้ให้บริการหรือการกำหนดใหม่
Logback - โหลดการกำหนดค่า Logback ใหม่
Log4j2 - โหลดการกำหนดค่า Log4j2 ใหม่
Mojarra (2.x) - รองรับการเปลี่ยนแปลงชุดทรัพยากรแอปพลิเคชัน (ไฟล์คุณสมบัติ) รองรับการปฏิเสธ/โหลดถั่ว ViewScoped
MyBatis (5.3) - โหลดการกำหนดค่าใหม่หลังจากการเปลี่ยนแปลงไฟล์ mapper
MyFaces (2.x-4.x) - รองรับการเปลี่ยนแปลงชุดทรัพยากรแอปพลิเคชัน (ไฟล์คุณสมบัติ) รองรับการปฏิเสธ/โหลดถั่ว ViewScoped
OmniFaces - รองรับการปฏิเสธ/โหลดถั่ว ViewScoped
OpenWebBeans - (CDI) (1.x-4.x) - รีโหลดคำจำกัดความคลาส bean หลังจากคำจำกัดความ/การเปลี่ยนแปลงคลาส สามารถโหลด Beans ซ้ำได้ตามกลยุทธ์ที่กำหนดไว้ในไฟล์คุณสมบัติ
OsgiEquinox - รองรับ Hotswap สำหรับปลั๊กอิน Eclipse หรือการพัฒนาแพลตฟอร์ม Eclipse
RestEasy (2.x, 3.x) - การล้างข้อมูลและการลงทะเบียนการกำหนดคลาสใหม่
Spring (3.2.x+, 4.x, 5.x) - รีโหลดการกำหนดค่า Spring หลังจากคำจำกัดความ/การเปลี่ยนแปลงคลาส
Spring Boot (1.5.x+, 2.0.x) - การรีโหลดไฟล์การกำหนดค่า Spring Boot แบบไดนามิกแบบเรียลไทม์
Vaadin (23.x, 24.x) - อัปเดตเส้นทาง โมเดลเทมเพลต และในทางปฏิบัติ ทุกสิ่งได้ทันที
WebObjects - ล้างการเข้ารหัสค่าคีย์ ส่วนประกอบ การดำเนินการ และแคชการตรวจสอบหลังจากการเปลี่ยนแปลงคลาส
Weld (CDI) (2.x-5.x) - รีโหลดคำจำกัดความคลาส bean หลังจากคำจำกัดความ/การเปลี่ยนแปลงคลาส สามารถโหลด Beans ซ้ำได้ตามกลยุทธ์ที่กำหนดไว้ในไฟล์คุณสมบัติ
ประตู - ล้างแคชประตูหากไฟล์คุณสมบัติมีการเปลี่ยนแปลง
WildFlyELResolver - ล้าง BeanELResolver หลังจากกำหนดคลาสใหม่
ZK (5x-7x) - กรอบงาน ZK (http://www.zkoss.org/) เปลี่ยนค่าเริ่มต้นคุณสมบัติไลบรารีเพื่อปิดใช้งานแคช รักษาแคชป้ายกำกับและแคชตัวแก้ไขถั่ว
JBossModules - เพิ่มพาธคลาสพิเศษให้กับตัวโหลดคลาสโมดูลของ JBoss (แมลงวัน)
Jetty - เพิ่ม classpath พิเศษให้กับ app classloader ควรรองรับทุกเวอร์ชันที่รองรับ WebAppContext.getExtraClasspath
Tomcat (7.x,8.x,9.x,10.x) กำหนดค่า Apache Tomcat ด้วยคุณสมบัติ extraClasspath และ webApp รองรับ GlassFish, Payara และ Tomee7
Undertow - เพิ่ม classpath, watchResources และ webappDir เพิ่มเติมให้กับตัวจัดการทรัพยากรของ undertow
Weblogic - เพิ่ม classpath พิเศษให้กับ app classloader
AnonymousClassPatch - สลับชื่อคลาสภายในที่ไม่ระบุชื่อเพื่อหลีกเลี่ยงการเปลี่ยนแปลงที่เข้ากันไม่ได้
ClassInit - เริ่มต้นค่าสมาชิกแบบคงที่/แจงนับใหม่หลังจากการกำหนดคลาส/แจงนับใหม่ และคงค่าคงที่ไว้ (แก้ไขข้อ จำกัด DCEVM ที่ทราบ)
Hotswapper - คอยดูการเปลี่ยนแปลงไฟล์คลาสและโหลดซ้ำ (hotswap) ได้ทันทีผ่าน Java Platform Debugger Architecture (JPDA)
พร็อกซี (รองรับ com.sun.proxy, CGlib) - กำหนดคลาสพร็อกซีใหม่ที่ใช้หรือขยายอินเทอร์เฟซหรือคลาสที่เปลี่ยนแปลง
ค้นหาเอกสารประกอบโดยละเอียดของปลั๊กอินแต่ละตัวในไฟล์ README.md หลักของโปรเจ็กต์ปลั๊กอิน
ขึ้นอยู่กับจำนวนเฟรมเวิร์กที่คุณใช้และแคชใดที่ถูกปิดใช้งาน ตัวอย่างการวัดสำหรับแอปพลิเคชันองค์กรขนาดใหญ่ในโลกแห่งความเป็นจริงที่ใช้ Spring + Hibernate ทำงานบน Jetty
Setup | Startup time -----------------------------|------------- Run (plain Java) | 23s Debug (plain Java) | 24s Debug (plain DCEVM) | 28s Agent - disabled all plugins | 31s Agent - all plugins | 35s
คุณสามารถเขียนปลั๊กอินเป็นส่วนหนึ่งของแอปพลิเคชันของคุณได้โดยตรง ตั้งค่า pluginPackages=your.plugin.package
ภายในการกำหนดค่า hotswap-agent.properties
ของคุณเพื่อค้นหาคลาสที่มีคำอธิบายประกอบ @Plugin
คุณจะต้องอาศัยการพึ่งพา JAR ของเอเจนต์ในการคอมไพล์ แต่ระวังอย่าเพิ่ม JAR ให้กับแอปพลิเคชันของคุณ จะต้องโหลดเป็นจาวาเอเจนต์เท่านั้น การพึ่งพา Maven:
org.hotswapagent HotswapAgent ${project.version} provided
ดู ExamplePlugin (ส่วนหนึ่งของ TestApplication) เพื่อดูปลั๊กอินแบบง่ายที่มีการแสดงความคิดเห็น อ่านตัวแทน readme เพื่อทำความเข้าใจแนวคิดตัวแทน ตรวจสอบซอร์สโค้ดปลั๊กอินที่มีอยู่เพื่อดูตัวอย่างเพิ่มเติม
เรียกใช้สคริปต์ run-tests.sh
ในไดเร็กทอรีหลัก ขณะนี้ คุณต้องตั้งค่าไดเร็กทอรีตำแหน่ง JAVA_HOME ด้วยตนเอง ควรตรวจสอบ Java 11 ที่มี DCEVM เป็นอย่างน้อยก่อนเผยแพร่ การทดสอบอัตโนมัติทั้งหมดได้รับการตั้งค่าให้ล้มเหลวทั้งสคริปต์ในกรณีที่การทดสอบล้มเหลวเพียงครั้งเดียว
ไปที่ไดเร็กทอรีที่แสดงถึงรูทของที่เก็บ ในกรณีที่ DCEVM ชื่อ dcevm
mvn release:prepare mvn release:perform
ตัวแทน Hotswap:
Jiri Bubnik - ผู้ประสานงานโครงการ การดำเนินการเบื้องต้น
Alexandros Papadakis - การกำหนดเวอร์ชัน Maven, Weld, JSF, Hibernate3, RestEasy, ปลั๊กอิน WildFly
Erki Ehtla - ปลั๊กอิน Spring, ปลั๊กอินพร็อกซี
Vladimir Dvorak - ELResolver, OsgiEquinox, เชื่อม, Owb, Deltaspike, Jvm, Jdk, JBossModules, ClassInit, JSF, Mybatis
Sergey Lysenko - ปลั๊กอินเชื่อม
Samuel Pelletier - ปลั๊กอิน WebObjects
Jan Tecl – ออกแบบเว็บไซต์
@liuzhengyang - ปลั๊กอินแจ็คสัน
Lukasz Warzecha - ปลั๊กอิน Log4j2
@muwaiwai - ปลั๊กอิน iBatis
Thomas Heigl - ปลั๊กอินประตู
AJ Banck - ปลั๊กอิน FreeMarker
Sinan Yumak - ปลั๊กอิน Mojarra, MyFaces
Smallfour - ปลั๊กอิน Mybatis
@cvictory - ปลั๊กอิน Spring, ปลั๊กอิน Spring Boot
@homejim - ปลั๊กอิน MyBatis, ปลั๊กอิน MyBatisPlus
DCEVM:
โธมัส เวือร์ทิงเกอร์ – การนำไปใช้เบื้องต้น
Ivan Dubrov - อดีตผู้ประสานงานโครงการ, อัปเดตเป็น Java7+Java8, แพตช์, ระบบบิลด์ (Gradle)
Kerstin Breitender - ผู้ร่วมให้ข้อมูล
คริสตอฟ วิมเบอร์เกอร์ - ผู้ร่วมให้ข้อมูล
Vladimir Dvorak - การโยกย้าย java9,java11,jbr17,jbr21, ผู้สนับสนุน
Jiri Bubnik - การโยกย้าย java9,java11