2011-08-09 4 views
6

मैं इस मुद्दे पर दौड़ रहा हूं जहां राइनो javax.script.ScriptEngine एपीआई के माध्यम से राइनो चलाते समय "Encountered code generation error while compiling script: generated bytecode for method exceeds 64K limit" अपवाद फेंकता है। स्वीकृत समाधान पर setOptimizationLevel(-1) का आह्वान करना प्रतीत होता है।जावा 6 में RhinoScriptEngine के लिए अनुकूलन स्तर सेट करना संभव है?

दुर्भाग्य से, द्वारा बनाई गई Context तक पहुंच नहीं लग रहा है। मैंने ContextFactory.Listener को ContextFactory.getGlobal() में जोड़ने का प्रयास किया है जो सृजन के बाद Context को संशोधित करेगा, लेकिन मेरे श्रोता को कभी भी कॉल नहीं किया जाता है। मैंने यह देखने के लिए RhinoScriptEngine source from Java 6 पर एक नज़र डाली कि क्या कोई ऐसी संपत्ति थी जिसे मैं सेट कर सकता हूं कि ContextFactory ऑप्टिमाइज़ेशन स्तर के मान को निर्धारित करने के लिए पढ़ा जाएगा।

जहां तक ​​मेरा बता सकता हूँ, जावा 7 में, RhinoScriptEngine-1 लिए अनुकूलन स्तर डिफ़ॉल्ट से सेट और यह संभव rhino.opt.level संपत्ति के माध्यम से अनुकूलन स्तर सेट करने में आता है। में makeContext() विधि Java 6 version में makeContext() विधि makeContext() विधि की तुलना करें, जिसका अर्थ है कि मेरा क्या मतलब है।

जहाँ तक मैं कह सकता हूं, मेरा मानना ​​है कि मेरा सबसे अच्छा विकल्प राइनो को सीधे चलाने के लिए है, जैसा कि in this example of using Rhino to run the CoffeeScript compiler दिखाया गया है। यद्यपि आप देख सकते हैं, कोड बहुत गड़बड़ है, इसलिए यदि संभव हो तो मैं javax.script.ScriptEngine एपीआई का उपयोग करना पसंद करूंगा, जबकि जावा 6 का समर्थन जारी रखता हूं। क्या कोई अन्य विकल्प हैं?

+0

एक अन्य विकल्प com.sun.script से कोड के सभी कॉपी करने के लिए है। जावास्क्रिप्ट पैकेज को एक नए पैकेज में (या संभावित रूप से समान नाम वाले वर्गों के साथ पैकेज-निजी सदस्यों तक पहुंचने के लिए) और अनुकूलन स्तर सेट करने के लिए makeContext() के कार्यान्वयन को बदलें, लेकिन यह ओवरकिल जैसा लगता है। – bolinfest

+0

मुझे एक ही समस्या से मुलाकात हुई। जेडीके 8 में 'नैशर्न' एक और उन्नत जेएस इंजन है, नैशर्न 64 के समस्या को हल कर सकता है। –

उत्तर

2

नहीं, प्रलेखन के अनुसार: http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html#jsengine

आपसे कहा जाए कि:

कुछ घटकों पदचिह्न और सुरक्षा कारणों से बाहर रखा गया है:

  1. जावास्क्रिप्ट को -bytecode संकलन (जिसे "अनुकूलक" भी कहा जाता है)। यह सुविधा क्लास जनरेशन लाइब्रेरी पर निर्भर करती है। इस सुविधा को हटाने का अर्थ है कि जावास्क्रिप्ट हमेशा व्याख्या किया जाएगा। इस सुविधा को हटाने से स्क्रिप्ट निष्पादन प्रभावित नहीं होता है क्योंकि ऑप्टिमाइज़र पारदर्शी है।

अनुकूलक वर्ग JDK6 साथ यह bundling इसलिए अनुकूलन स्तर के लिए बाहर निकाल दिया गया जावा के लिए निर्धारित नहीं किया जा सकता 6.

+0

लेकिन प्रतिसाद नहीं यह अनुकूलन स्तर -1 के बराबर नहीं है, ओपी क्या चाहता था? निश्चित रूप से कोड जनरेशन संकलन त्रुटियों को जावा 6 के तहत नहीं होना चाहिए यदि इसका हमेशा व्याख्या किया जाता है। – bacar

1

मैं 6 के साथ चल रहा हूं और यह डिफ़ॉल्ट रूप से -1 पर सेट भी प्रतीत होता है। या इसके बजाए, जब तक sun.org.mozilla.javascript.internal.optimizer.Codegen क्लासपाथ पर नहीं है, तो यह -1 पर सेट है।

+0

हम्म, एक समस्या हो सकती है कि मैं OpenJDK उपयोग कर रहा हूँ: $ जावा -संस्करण जावा संस्करण "1.6.0_22" OpenJDK रनटाइम वातावरण (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1 ~ 11.04.1) ओपनजेडीके 64-बिट सर्वर वीएम (बिल्ड 20।0-बी 11, मिश्रित मोड) सूर्य जेडीके में राइनो के आसपास कुछ मतभेद हैं। हम चीजों अपने प्रोजेक्ट के लिए दोनों JDKs पर काम करने के लिए कुछ बहुत अजीब काम करने के लिए, plovr था: http://code.google.com/p/plovr/source/detail?r=7e3cad7f1b9d – bolinfest

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