क्लोजर 1.2.1 / 1.3 / 1.4 'ग्रिल्स 2.0.0 रनटाइम में उत्पन्न प्रॉक्सी विफल हो जाती है। 1.2.0 ठीक है


103

मैं विस्तार पर काम कर रहा हूँ Grails Clojure प्लगइन में Grails 2.0.0 (और 2.1.0-स्नैपशॉट) और मैं उसे अपडेट करने के लिए चाहते थे Clojure 1.3.0 और जोड़ने clojure.tools.logging

Clojure एक के संकलन के दौरान एक अपवाद फेंकता प्रॉक्सी एक की ByteArrayOutputStreamमें clojure.tools.loggingकी लॉग-धारा समारोह:

ClassCastException: clojure.asm.Type cannot be cast to clojure.lang.IFn

( https://gist.github.com/a6ae681c37091a3d2379 )

मैं चला गया और हटाया clojure.tools.loggingऔर एक नीचे छीन लिखा प्रॉक्सी की Object:

(proxy [java.lang.Object] [] (toString [] "proxy's toString"))

और यह भी है कि एक ही फेंक दिया ClassCastExceptionऔर संदेश।

मैं एक प्रिंट करने की कोशिश macroexpand -1 का प्रॉक्सी और एक ही बात हो गया।

मैं क्लोजर 1.2.0 पर लौट आया और प्रॉक्सी ने फिर से ठीक काम किया।

मैंने 1.4.0 के कई अवतारों की कोशिश की और वे 1.3.0 के समान व्यवहार प्रदर्शित करते हैं। 1.2.1 भी कुछ प्रकार के अपवादों को फेंकता है, लेकिन मैं 1.3.0 हिट करने की कोशिश कर रहा हूं, इसलिए मैंने उसके साथ ज्यादा समय नहीं बिताया।

'जनरल-विधि कार्य करने के लिए अंक स्टैक ट्रेस में से एक के रूप में परिभाषित लेट के रूपों generate-proxyमें core_proxy.clj

मैंने printlnयह देखने के लिए कि क्या हो रहा था, उसे देखने के लिए एक छोटे से चापाकल को वहाँ चारों ओर जोड़ा । हो सकता है कि यह अगला वक्तव्य मेरे हिस्से पर पाठक की एक बड़ी गलतफहमी को धोखा दे, लेकिन बस उन लोगों printlnके संकलन समय व्यवहार को एक तरह से बदल दिया, जिसकी मुझे पूरी उम्मीद नहीं थी। अपवाद स्थान और अपवाद प्रकार पूरी तरह से बदल गया, भले ही सभी क्लोजर परीक्षण mvn packageपास जारी रखने के लिए।

उदाहरण के लिए, बस एक ही printlnजीन-विधि को जोड़ने से पहले यह बायटेकोड उत्पन्न करना शुरू कर देता है जिससे क्लोजर फेंक दिया जाता है

ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class

( https://gist.github.com/5a7a40929a6c4a104bd5 )

मैंने विभिन्न अन्य त्रुटियों को देखा है, जहां पर मैंने println(s) रखा है, लेकिन यह सबसे अधिक प्रचलित है।

जाहिर है कि ग्रेल्स और क्लोजर के कुछ पहलू यहां सही ढंग से नहीं लगे हैं, लेकिन मैं कनेक्शन नहीं देख रहा हूं। पहले तो मुझे ASM की असंगति पर संदेह हुआ लेकिन चूंकि क्लोजर का अपना ASM नाम स्थान है, इसलिए मैं यह नहीं देख सकता कि यह मुद्दा है। लेकिन शायद मैं गलत, मैं घूर रहा है कर रहा हूँ clojure.lang.Compiler, प्रॉक्सी और उत्पन्न-प्रॉक्सी दिनों के लिए अब काम करने के लिए इस प्राप्त करने की कोशिश और मैं काफी आगे बना रही प्रगति क्योंकि मैं भाप समाप्त हो चुकी है बंद कर दिया है :(

मैं लिंक की कमी के लिए माफी मांगता हूं। आप नीचे से कॉपी और पेस्ट कर सकते हैं:

ग्रेल्स क्लोजर - github.com/grails-plugins/grails-clojure

क्लोजर टूल्स लॉगिंग - github.com/clojure/tools.log/blob/master/src/main/clojure/clojure/tools/log.clj लाइन 133 'प्रॉक्सी है


4
मैंने कुछ और परीक्षण किए हैं और मैं सभी को आश्वस्त करता हूं कि यह ग्रिल्स 2.0 में कुछ है जो क्लोजर 1.3 पर निर्भर करता है। मैंने सबसे सरल कोड नमूने का परीक्षण किया जिसे मैं ग्रिल्स 1.3.7, ग्रूवी 1.8.4 (जो कि ग्रिल्स 2.0 का उपयोग करता है) और ग्रूवी 1.8.5 (नवीनतम) और उन सभी कामों में गर्भ धारण कर सकते हैं।
जॉन कोर्टलैंड

3
क्या यह एक ClassLoader मुद्दा हो सकता है?
जेरेमी

जवाबों:


4

मुझे clojure.orgCLJ-944 पर एक अंक मिला । वहाँ आप के लिए एक ठीक पा सकते हैं मुद्देClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class

यह समस्या है:

यह कंपाइलर clojure.lang.PersistentHashMap पर गलत कास्ट इंजेक्ट करता है। इस मामले में यह संभवतः एक क्लोजर.लंग के लिए डाली जानी चाहिए। सामाजिक, .containsKey विधि वाले उच्चतम सामान्य इंटरफ़ेस।

पैच 1 - 0001-फिक्स-के लिए CLJ-944.patch

पैच 2 - 0002-Fix-for-CLJ-944.patch

मुझे उम्मीद है यह मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.