2015-01-05 8 views
6

मैं जावास्क्रिप्ट इंजन नया जावा 8 Nashorn के साथ एक जावास्क्रिप्ट स्क्रिप्ट चलाने के लिए कोशिश कर रहा हूँ, लेकिन यह निम्न त्रुटि के साथ विफल:readFully जावा Nashorn जावास्क्रिप्ट इंजन के साथ परिभाषित नहीं

<eval>:1 ReferenceError: "readFully" is not defined 

स्क्रिप्ट readFully समारोह है कि ऐसा करना चाहिए का उपयोग करता है वैश्विक स्कोप में परिभाषित किया गया है nashorn स्क्रिप्टिंग मोड सक्षम के साथ चलाया जाता है (जो स्क्रिप्टइंजिन के माध्यम से चलते समय डिफ़ॉल्ट है http://mail.openjdk.java.net/pipermail/nashorn-dev/2013-December/002562.html)।

import java.io.FileNotFoundException; 

import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 
import javax.script.ScriptException; 

public class Test { 

    public static void main(String[] argv) throws FileNotFoundException, ScriptException { 
     ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("nashorn"); 

     scriptEngine.eval("print('Hey!');print(print);print(readFully);"); 


    } 
} 

यह नमूना प्रिंट हे:

यहाँ त्रुटि पुन: पेश करने के लिए एक नमूना है! और उसके बाद प्रिंट फ़ंक्शन का स्रोत कोड (एक अन्य नाशर्न अंतर्निहित फ़ंक्शन) और अंततः इसे पढ़ने के विधि के स्रोत कोड को मुद्रित करना चाहिए।

Exception in thread "main" javax.script.ScriptException: ReferenceError: "readFully" is not defined in <eval> at line number 1 
    at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:586) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:570) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:525) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:521) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:192) 
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264) 
    at com.github.bringking.maven.requirejs.Test.main(Test.java:14) 
Caused by: <eval>:1 ReferenceError: "readFully" is not defined 
    at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:58) 
    at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:320) 
    at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:292) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.__noSuchProperty__(NashornScriptEngine.java:272) 
    at jdk.nashorn.internal.scripts.Script$engine.L:35(nashorn:engine/resources/engine.js:37) 
    at jdk.nashorn.internal.scripts.Script$\^eval\_.runScript(<eval>:1) 
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:535) 
    at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:209) 
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:378) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:568) 
    ... 5 more 

नमूना स्क्रिप्ट -scripting पैरामीटर (JDK के Jjs उपकरण के साथ) के साथ nashorn कमांड लाइन के साथ चलाया जाता है, सब ठीक है: लेकिन मैं इसके बजाय यह अपवाद है। यहाँ एक ही स्क्रिप्ट का परिणाम है:

Hey! 
function print() { [native code] } 
function readFully() { [native code] } 

मैं एक readFully विधि को फिर से लिखने और स्क्रिप्ट संदर्भ के साथ यह बाँध सकता है, लेकिन मैं समझता हूँ कि क्यों यह काम नहीं करता है और पहले से निर्मित कार्यों का उपयोग पसंद करते हैं।

सादर

+0

क्या JDK प्रयोग कर रहे हैं? ओरेकल या ओपनजेडीके? –

+0

विंडोज 7 पर ऑर्केल जेडीके: जावा संस्करण "1.8.0_25", जावा (टीएम) एसई रनटाइम पर्यावरण (1.8.0_25-बी 18 बनाएं), जावा हॉटस्पॉट (टीएम) क्लाइंट वीएम (25.25-बी 022, मिश्रित मोड बनाएं) – Stratehm

+0

ब्लॉग पोस्ट से जुड़ा हुआ पोस्ट फिर से है: openjdk। वे अभी भी थोड़ा अलग हैं। वास्तव में –

उत्तर

4

अंत में, मैं एक readFully समारोह है कि मैं (Nashorn साथ केवल संगत) मेरी स्क्रिप्ट में उपयोग को लागू किया है मोड।Nashorn docs

इस प्रयास करें:

>>jjs -scripting 
jjs> readFully("your_file") 
2

readFully एक मानक जावास्क्रिप्ट फंक्शन नहीं है और यह संभावना Nashorn में मानक या तो नहीं है।

similar issues थे जब राइनो को जावा 6 के सूर्य कार्यान्वयन में शामिल करने के लिए चुना गया था। स्क्रिप्टिंग टूल उन एन्हांसमेंट प्रदान कर सकता है जो एम्बेडेड एपीआई में मौजूद नहीं हैं। readFullyJava 8 Nashorn API में एक दस्तावेज कार्य नहीं है।

जावा के पिछले संस्करणों में विनिर्देश कहा गया है कि प्रदान की पटकथा इंजन JRE विक्रेता के एक कार्यान्वयन विस्तार थे। मुझे पता नहीं है कि क्या जावा 8 अनिवार्य रूप से प्रदान किए गए इंजनों के बारे में कुछ भी बनाता है या यह भविष्य में संगतता गारंटी देता है या नहीं। मैं JSR-337 को पूरी तरह से जांचूंगा यदि यह एक मुद्दा होने की संभावना है।

+0

जानकारी के लिए धन्यवाद। मैं अपने द्वारा एक readFully समारोह लागू करेंगे। – Stratehm

1

https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions

readFully (-scripting मोड केवल)

यह समारोह एक फ़ाइल के लिए एक स्ट्रिंग तर्क के रूप में में पारित की सारी सामग्री को पढ़ता है और stdout को भेज देता है, या आप एक चर के लिए परिणाम प्रदान कर सकते हैं ।

readFully उदाहरण:

function readFully(url) { 
    var result = ""; 
    var imports = new JavaImporter(java.net, java.lang, java.io); 

    with (imports) { 

     var urlObj = null; 

     try { 
      urlObj = new URL(url); 
     } catch (e) { 
      // If the URL cannot be built, assume it is a file path. 
      urlObj = new URL(new File(url).toURI().toURL()); 
     } 

     var reader = new BufferedReader(new InputStreamReader(urlObj.openStream())); 

     var line = reader.readLine(); 
     while (line != null) { 
      result += line + "\n"; 
      line = reader.readLine(); 
     } 

     reader.close(); 
    } 

    return result; 
} 
+0

मेरी समस्या यह है कि ScriptEngine API के माध्यम से चलते समय पूरी तरह से परिभाषित नहीं किया गया है। Jjs निष्पादन योग्य नहीं है (इस तरह, सब ठीक है)। – Stratehm

+1

आप सीधे नाशर्न इंटरफ़ेस नैशर्नस्क्रिप्टइंजिन फैक्ट्री फैक्ट्री = नया नैशर्नस्क्रिप्टइंजिन फैक्ट्री(); का उपयोग करके नैशर्न को विकल्प पास कर सकते हैं; स्ट्रिंग [] विकल्प = नया स्ट्रिंग [] {"-स्क्रिप्टिंग"}; नैशर्नस्क्रिप्टइंजिन इंजन = factory.getScriptEngine (विकल्प); या बस स्क्रिप्ट के पहले अक्षर के रूप में '#' डालें। – wickund

0

readFully केवल पटकथा में सक्षम है:

jjs> readFully("text.txt") This is the contents of the text.txt file located in the current working directory.

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