2011-01-14 22 views
5

मैं यह समझने की कोशिश कर रहा हूं कि केक अपने एकाधिक जेवीएम दृष्टिकोण को कैसे लागू करता है। एक उच्च स्तर पर, मैंने सोचा कि केक नाखून के समान काम कर रहा था, जहां एक एकल जेवीएम इंस्टेंस (एक जेवीएम प्रक्रिया) है, और विभिन्न परियोजनाओं के लिए नए "जेवीएम" वास्तव में केवल एक नए क्लासलोडर में क्लोजर/जार का मूल्यांकन किया गया था (साथ ही अलग जार निर्भरता), जो मेरी आंखों में एक नया जेवीएम उदाहरण नहीं है। What's the difference between Cake and Leiningen? से, एक निहितार्थ है कि कई JVMs (केक के लिए एक, और * परियोजनाओं के लिए) हैं, न केवल एक एकल JVM उदाहरण।केक में लगातार जेवीएम सुविधा कैसे लागू की जाती है?

यदि नए जेवीएम उदाहरण बनाए गए हैं, तो गति कहाँ से आती है? मेरी समझ के साथ, मैं तर्क दूंगा कि एक नया जेवीएम शुरू करने से ताजा एक नई जेवीएम प्रक्रिया बनती है जो सामान्य रूप से समान स्टार्टअप ओवरहेड बनाती है।

यदि नहीं हैं, तो देशी निर्भरताओं को कैसे जोड़ा जाता है? जो मैं समझता हूं, उससे JVM केवल रनटाइम से पहले पारित कमांड लाइन तर्कों से देशी निर्भरताओं के बारे में जानता है। एकमात्र तरीका मुझे पता है कि इसे कैसे बाधित करना है नीचे सूचीबद्ध सूर्य/ओरेकल जेवीएम कार्यान्वयन विशिष्ट हैक के साथ है।

(let [clazz java.lang.ClassLoader 
     field (.getDeclaredField clazz "sys_paths")] 
    (.setAccessible field true) 
    (.set field clazz nil) 
    (System/setProperty "java.library.path" (apply str (interpose ";" native-paths)))) 

उत्तर

4

केक में एक रूबी स्क्रिप्ट है जो जेवीएम शुरू होती है और प्रबंधित करती है। रूबी में JVM ओवरहेड नहीं है, इसलिए रूबी स्क्रिप्ट JVMs बना सकती है और फिर जब आप कमांड निष्पादित करते हैं, तो रूबी स्क्रिप्ट उन आदेशों को JVMs में सौंपेगी।

कारण दो जेवीएम आवश्यक था ताकि केक की निर्भरता (केक जेवीएम) परियोजना की निर्भरताओं (सेंकना जेवीएम) से अलग थी। प्रोजेक्ट के क्लासपाथ का लाभ उठाने के लिए cake repl जैसे कुछ आदेश बेक जेवीएम में चलते हैं।

हालांकि, हाल के संस्करण में, प्रति परियोजना केवल एक ही जेवीएम है। यह एक ही JVM में विभिन्न क्लासलोडर्स का उपयोग करना संभव है। उपयोग की जाने वाली प्रासंगिक लाइब्रेरी classlojure है।

यहां तक ​​कि दो जेवीएम संस्करणों के साथ, जेवीएम लगातार थे, जिसका अर्थ है कि वे केवल एक बार पैदा हुए थे और फिर पूरी तरह जरूरी होने पर ही फिर से शुरू किया गया था, जैसे बदले गए क्लासपाथ (जब आप एक नई निर्भरता या कुछ समान जोड़ते हैं) के मामले में। मुझे यकीन नहीं है कि आप क्यों सोचेंगे कि इसका मतलब यह होगा कि प्रत्येक बार कमांड निष्पादित होने पर JVM ओवरहेड को लेना होगा। विचार यह है कि JVM शुरू करने वाले प्रत्येक कमांड के बजाए बहुत से आदेश तत्काल होते हैं।

+1

धन्यवाद। ठीक है, पुराने संस्करण के साथ, प्रति परियोजना एक नया जेवीएम बनाया गया था, मैं गलत इंप्रेशन के तहत था कि, फिर से, यह नाखून के समान था, जहां केवल एक ही, एक जेवीएम उदाहरण है। जेवीएम स्टार्टअप समय के संबंध में नाखून विधि विधि मेरे दिमाग में आदर्श थी और सुरक्षा मुद्दों को अनदेखा कर रहा था, जिसे मैं अब महसूस करता हूं कि केक लागू नहीं किया गया है। मैं परिस्थितियों में JVM स्टार्टअप समय के संबंध में लाभ निर्धारित करने का प्रयास कर रहा था जब JVM को प्रत्येक केक कमांड के अनुसार पुनरारंभ या निर्मित करने की आवश्यकता नहीं थी। – bmillare

+0

क्या क्लासलोज समर्थन रनटाइम देशी निर्भरता लोडिंग करता है? – bmillare

2

रेनेस सही है। केक 0.6.0 के रूप में, प्रति परियोजना एक JVM है। केक मुख्य क्लासलोडर में चलता है और प्रोजेक्ट को एक अलग क्लासलोडर में लोड करने के लिए क्लासलोर्ज का उपयोग करता है और क्लासपाथ बदलते समय इसे पुनः लोड करता है। हमने सभी परियोजनाओं के बीच एक एकल जेवीएम साझा करने के लिए वैश्विक ~/.cake/config विकल्प पर चर्चा की है। Classlojure का उपयोग करके इसे जोड़ना बहुत कठिन नहीं होना चाहिए। इस दृष्टिकोण के साथ मुख्य मुद्दा यह है कि कैसे केक टास्क प्लगइन्स को अलग रखें। शायद वैश्विक केक प्रोजेक्ट मुख्य क्लासलोडर में चलाया जा सकता है और प्रत्येक परियोजना को दो क्लासलोडर मिल सकते हैं (केक के लिए एक और प्रोजेक्ट के लिए एक)।

देशी निर्भरताओं के लिए, क्लासलोज JVM शुरू होने के बाद उन्हें जोड़ने का समर्थन नहीं करता है। इस कार्यक्षमता को जोड़ने के लिए एक पैच तब तक स्वागत होगा जब तक मूल पुस्तकालय पथ एक विशिष्ट क्लासलोडर के लिए स्थानीय नहीं है और उसी JVM में सभी क्लासलोडर्स के बीच साझा नहीं किया जाता है।

+0

दुर्भाग्यवश, जिन अंतिम उल्लेखों का आप उल्लेख करते हैं, वे मूल रूप से (मेरे ज्ञान के लिए) असंभव हैं। इसके अतिरिक्त, यदि मैंने विभिन्न जेवीएम कार्यान्वयन के साथ चलाया था तो ऊपर दिया गया कोड तोड़ देगा। – bmillare

संबंधित मुद्दे