هذه صفحة نظرة عامة، يرجى زيارة hotswapagent.org لمزيد من المعلومات.
جافا غير محدود فئة وقت التشغيل وإعادة تعريف الموارد.
كان الهدف الأساسي لهذا المشروع هو إلغاء الحاجة إلى دورة التطوير التقليدية "رمز التغيير -> إعادة التشغيل والانتظار... -> التحقق". بمرور الوقت، تطور هذا المفهوم إلى نموذج جديد ضمن نظام Java البيئي، مما يسمح بتطوير البرامج في الوقت الفعلي ضمن تطبيق قيد التشغيل. هذا الأسلوب ممكن حتى في البيئات المقيدة، مثل حاويات Docker.
إذا كنت من مستخدمي IntelliJ، فيمكنك تبسيط إعداد HA وDCEVM باستخدام البرنامج الإضافي IntelliJ HotSwapHelper.
التنزيل والتثبيت:
بالنسبة إلى Java 17/21: قم بتنزيل أحدث إصدار من JBR17 أو JBR21. نظرًا لأن هذه الإصدارات لا تتضمن وكيل Hotswap مدمجًا، فستحتاج إلى نسخ hotswap-agent.jar
يدويًا إلى المجلد lib/hotswap
. يمكنك العثور على أحدث وكيل Hotswap هنا. تأكد من تسمية الملف الموجود في المجلد 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. كبديل core
أو external
يمكن استخدام الأوضاع بدلاً من fatjar
.
Java11: قم بتشغيل التطبيق الخاص بك باستخدام الخيارات -XX:HotswapAgent=fatjar
لاستخدام إصدار Hotswap Agent Fatjar.
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).
مسار فئة إضافي - هل تحتاج إلى تغيير فئة وقت التشغيل داخل JAR التابع؟ استخدم خاصية extraClasspath لإضافة أي دليل كمسار فئة لمشاهدة ملفات الفئة.
إعادة تحميل المورد بعد التغيير - عادةً ما يتم إعادة تحميل الموارد من دليل webapp بواسطة خادم التطبيق. ولكن ماذا عن الموارد الأخرى مثل src/main/resources؟ استخدم خاصية watchResources لإضافة أي دليل لمراقبة تغيير المورد.
دعم إطار العمل - من خلال نظام المكونات الإضافية، يتم دعم العديد من أطر العمل. يمكن إضافة الإضافات الجديدة بسهولة.
سريع - حتى تتم تهيئة المكون الإضافي، فهو لا يستهلك أي موارد أو يؤدي إلى إبطاء التطبيق (راجع عبء وقت التشغيل لمزيد من المعلومات)
إذا كان لديك أي مشاكل أو أسئلة، اسأل في منتدى HotswapAgent.
هذا المشروع مشابه لـ JRebel. الاختلافات الرئيسية هي:
يدعم HotswapAgent (DCEVM) Java8 وJava11 وJava17!
لا يحتاج HotswapAgent إلى أي تكوين إضافي لإعداد المشروع الأساسي.
يعد JRebel حاليًا أكثر نضجًا ويحتوي على المزيد من المكونات الإضافية.
JRebel ليس مفتوح المصدر ولا مجاني.
يقوم JRebel بتعديل الرمز الثانوي لجميع الفئات عند إعادة التحميل. أنت بحاجة إلى مكون إضافي خاص بـ IDE لإصلاح تصحيح الأخطاء.
يشبه HotswapAgent extraClasspath تكوين JRebel
يضيف HotswapAgent تكوين watchResources
راجع مشروع HotswapAgentExamples على GitHub. الغرض من تطبيق المثال هو:
اختبارات التكامل التلقائية المعقدة (تحقق من التكوينات المختلفة قبل الإصدار، راجع البرنامج النصي run-tests.sh
)
للتحقق من استخدام البرنامج المساعد "في العالم الحقيقي" أثناء تطوير البرنامج المساعد (أي داخل الحاوية)
لتوفير حل عملي لإعدادات التطبيق النموذجية
وضع الحماية لمحاكاة مشكلات الإعدادات الحالية أو الجديدة
لا تتردد في التفرع/الفرع وإنشاء تطبيق للإعداد الخاص بك (عملي، ولكنه بسيط قدر الإمكان). سيتم دمج الإعدادات العامة في البرنامج الرئيسي.
لا شيء مطلوب :) حقا! جميع التغييرات شفافة وكل ما عليك فعله هو تنزيل patch+agent وإعداد خادم التطبيق/التطبيق الخاص بك. نظرًا لأننا نستخدم سلوك Java hotswap القياسي، فسيعمل IDE الخاص بك كما هو متوقع. ومع ذلك، فإننا نعمل على مكونات IDE الإضافية للمساعدة في التنزيل والتكوين.
بعض المكونات الإضافية متاحة بالفعل:
أضف إجراءين بجوار زر "Debug" في intellij، Run with hotswap، Debug with hotswap.
عند النقر فوق الإجراء، سيتم تعيين معلمات vm لك، ولا حاجة لتعيين معلمات vm يدويًا.
كود المصدر والوثائق: https://github.com/gejun123456/HotSwapHelper.
تم تعيين التكوين الأساسي لإعادة تحميل الفئات والموارد من مسار الفصل المعروف للتطبيق قيد التشغيل (محمل الفصل). إذا كنت بحاجة إلى تكوين مختلف، أضف ملف hotswap-agent.properties إلى جذر مسار الفئة (على سبيل المثال src/main/resources/hotswap-agent.properties
).
يمكن العثور على الوثائق التفصيلية للخصائص المتاحة والقيم الافتراضية في ملف خصائص الوكيل
بناء الجملة الكامل لخيارات سطر الأوامر هو:
-javaagent:[yourpath/]hotswap-agent.jar=[option1]=[value1],[option2]=[value2]
يقبل وكيل Hotswap الخيارات التالية:
autoHotswap=true - شاهد جميع ملفات .class للتغيير وقم تلقائيًا بتبديل الفئة في التطبيق قيد التشغيل (بدلاً من تشغيل Hotswap من جلسة تصحيح أخطاء IDE الخاصة بك)
DisablePlugin=[pluginName] - تعطيل المكون الإضافي. لاحظ أن هذا سيمنع تحميل المكون الإضافي تمامًا (على عكس خيار DisablePlugin في hotswap-agent.properties، والذي سيؤدي فقط إلى تعطيل المكون الإضافي لمحمل فئة. يمكنك تكرار هذا الخيار لكل مكون إضافي لتعطيله.
إضافة خيار vm -Dhotswapagent.disablePlugin=Spring,SpringBoot لتعطيل المكونات الإضافية، ويعمل بنفس خيار الوكيل DisablePlugin في القسم السابق.
يقوم وكيل Hotswap بإعادة تحميل الموارد وتكوين إطار العمل (Spring، Hibernate، ...)، ولكنه يعتمد على آلية Java hotswap القياسية لإعادة تحميل الفئات. يسمح برنامج Java hotswap القياسي بتغيير نص الطريقة فقط، مما يجعله غير قابل للاستخدام عمليًا. DCEVM عبارة عن تصحيح JVM (نقطة الاتصال) الذي يسمح تقريبًا بأي تغيير في الفئة الهيكلية على hotswap (باستثناء تغيير التسلسل الهرمي). على الرغم من أن وكيل hotswap يعمل حتى مع لغة Java القياسية، إلا أننا نوصي باستخدام DCEVM (وجميع البرامج التعليمية تستخدم DCEVM كهدف JVM).
وكيل Hotswap عبارة عن حاوية مكون إضافي تحتوي على مدير البرنامج المساعد وسجل البرنامج المساعد والعديد من خدمات الوكيل (على سبيل المثال لمراقبة تغيير الفئة/المورد). فهو يساعد في المهام الشائعة ومشكلات تحميل الفصل الدراسي. فهو يقوم بمسح مسار الفصل بحثًا عن الفصل الذي تم التعليق عليه باستخدام التعليق التوضيحي @Plugin، ويدخل خدمات الوكيل، ويسجل خطافات إعادة التحميل. يتم توفير تعديل رمز بايت وقت التشغيل بواسطة مكتبة جافاسيست.
عادةً ما تركز المكونات الإضافية التي يديرها Hotswap Agent على إطار عمل محدد. على سبيل المثال، يستخدم البرنامج المساعد Spring خدمات HA من أجل:
قم بتعديل فئات Spring الجذرية للحصول على سياقات Spring ومسار الفحص المسجل
انتبه لأي تغيير في الموارد على مسار الفحص
راقب عملية التبديل السريع لملف فئة ضمن حزمة مسار الفحص
إعادة تحميل تعريف الفول بعد التغيير
... وغيرها الكثير
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 عند تغيير تعريف الفئة.
السبات (3.x-6.x) - إعادة تحميل تكوين السبات بعد إنشاء/تغيير الكيان.
iBatis - إعادة تحميل تكوين iBatis.
IDEA - دعم تطوير IntelliJ IDEA في IDEA
جاكسون - يمسح ذاكرة التخزين المؤقت الداخلية لجاكسون عند إعادة تعريف الفصل.
Jersey1 - إعادة تحميل حاوية Jersey1 بعد تعريف أو إعادة تعريف المورد الجذر أو فئة الموفر.
Jersey2 - أعد تحميل حاوية Jersey2 بعد تعريف أو إعادة تعريف المورد الجذر أو فئة الموفر.
Logback - إعادة تحميل تكوين Logback.
Log4j2 - إعادة تحميل تكوين Log4j2.
Mojarra (2.x) - دعم تغييرات حزمة موارد التطبيق (ملف الخصائص). دعم إعادة حقن/إعادة تحميل حبوب ViewScoped.
MyBatis (5.3) - إعادة تحميل التكوين بعد تغيير ملف معين
MyFaces (2.x-4.x) - دعم تغييرات حزمة موارد التطبيق (ملفات الخصائص). دعم إعادة حقن/إعادة تحميل حبوب ViewScoped.
OmniFaces - دعم إعادة حقن/إعادة تحميل حبوب ViewScoped.
OpenWebBeans - (CDI) (1.x-4.x) - إعادة تحميل تعريف فئة الفول بعد تعريف/تغيير الفئة. يمكن إعادة تحميل الحبوب وفقًا للاستراتيجية المحددة في ملف الخاصية.
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) - إعادة تحميل تعريف فئة الفول بعد تعريف/تغيير الفئة. يمكن إعادة تحميل الحبوب وفقًا للاستراتيجية المحددة في ملف الخاصية.
الويكيت - مسح ذاكرة التخزين المؤقت للويكيت إذا تم تغيير ملفات الخصائص
WildFlyELResolver - امسح BeanELResolver بعد إعادة تعريف أي فئة.
ZK (5x-7x) - إطار عمل ZK (http://www.zkoss.org/). قم بتغيير القيم الافتراضية لخصائص المكتبة لتعطيل ذاكرة التخزين المؤقت، والحفاظ على ذاكرة التخزين المؤقت للتسمية وذاكرة التخزين المؤقت لمحلل الفول.
JBossModules - إضافة مسار فئة إضافي إلى محمل فئة الوحدة النمطية لـ JBoss. (الذبابة البرية)
Jetty - أضف مسار فئة إضافي إلى أداة تحميل فئة التطبيق. يجب أن تكون جميع الإصدارات التي تدعم WebAppContext.getExtraClasspath مدعومة.
يقوم Tomcat (7.x,8.x,9.x,10.x) بتكوين Apache Tomcat باستخدام خاصية extraClasspath وwebApp. يدعم أيضًا GlassFish وPayara وTomee7.
Undertow - أضف مسارًا إضافيًا وwatchResources وwebappDir إلى مدير الموارد الخاص بالجزء السفلي.
Weblogic - إضافة مسار فئة إضافي إلى أداة تحميل فئة التطبيق.
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 إلى تطبيقك؛ يجب أن يتم تحميله فقط باعتباره javaagent. تبعية مافن:
org.hotswapagent HotswapAgent ${project.version} provided
راجع examplePlugin (جزء من TestApplication) للاطلاع على مكون إضافي بسيط تم التعليق عليه. اقرأ الملف التمهيدي للوكيل لفهم مفاهيم الوكيل. تحقق من كود مصدر المكونات الإضافية الموجودة لمزيد من الأمثلة.
قم بتشغيل البرنامج النصي run-tests.sh
في الدليل الرئيسي. حاليًا، يتعين عليك إعداد دليل موقع Java_HOME يدويًا. يجب التحقق من Java 11 مع DCEVM على الأقل قبل الإصدار. يتم تعيين جميع الاختبارات التلقائية على فشل البرنامج النصي بأكمله في حالة فشل أي اختبار واحد.
انتقل إلى الدليل الذي يمثل جذر المستودع. في حالة تسمية DCEVM dcevm
mvn release:prepare mvn release:perform
وكيل Hotswap:
جيري بوبنيك - منسق المشروع، التنفيذ الأولي
ألكسندروس باباداكيس - Maven Versioning، Weld، JSF، Hibernate3، RestEasy، WildFly plugins
إركي إهتلا - البرنامج المساعد الربيع، البرنامج المساعد الوكيل
فلاديمير دفوراك - ELResolver، OsgiEquinox، Weld، Owb، Deltaspike، Jvm، Jdk، JBossModules، ClassInit، JSF، Mybatis
سيرجي ليسينكو - البرنامج المساعد لحام
صامويل بيليتير - البرنامج المساعد WebObjects
جان تيكل - تصميم مواقع الإنترنت
@liuzhengyang - البرنامج المساعد جاكسون
لوكاش وارزيتشا - البرنامج المساعد Log4j2
@muwaiwai - البرنامج المساعد iBatis
توماس هيغل - البرنامج المساعد ويكيت
AJ Bankk - البرنامج المساعد FreeMarker
سنان يوماك - Mojarra، ملحقات MyFaces
Smallfour - البرنامج المساعد Mybatis
@cvictory - البرنامج المساعد الربيع، البرنامج المساعد التمهيد الربيع
@homejim - البرنامج المساعد MyBatis، البرنامج المساعد MyBatisPlus
DCEVM:
توماس ورثينغر - التنفيذ الأولي.
إيفان دوبروف - منسق المشروع السابق، التحديث إلى Java7 + Java8، التصحيحات، نظام البناء (Gradle)
كريستين بريتندر - مساهم.
كريستوف ويمبرجر – مساهم.
فلاديمير دفوراك - هجرة java9,java11,jbr17,jbr21، مساهم
جيري بوبنيك - هجرة java9،java11