2015-01-05 15 views
6

Tôi cố gắng để chạy một kịch bản javascript với mới Java 8 Nashorn động cơ javascript nhưng nó không thành công với các lỗi sau:readFully không được định nghĩa với Java Nashorn Javascript cơ

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

Các kịch bản sử dụng hàm readFully rằng nên được định nghĩa trong phạm vi toàn cầu nashorn được chạy với chế độ kịch bản được kích hoạt (mặc định là khi chạy qua một ScriptEngine như được thấy ở đây http://mail.openjdk.java.net/pipermail/nashorn-dev/2013-December/002562.html).

Đây là một mẫu để sao chép các lỗi:

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);"); 


    } 
} 

mẫu này in Hey! và sau đó là mã nguồn của chức năng in (chức năng tích hợp nashorn khác) và cuối cùng nó sẽ in mã nguồn của phương thức readFully. Nhưng tôi có ngoại lệ này thay vì:

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 

Khi kịch bản mẫu được chạy với dòng lệnh nashorn với tham số -scripting (với công cụ JJS của jdk), tất cả đều tốt. Đây là kết quả của kịch bản giống nhau:

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

tôi có thể viết lại một phương pháp readFully và ràng buộc nó với bối cảnh kịch bản, nhưng tôi thích để hiểu tại sao nó không hoạt động và sử dụng các chức năng đã được tích hợp sẵn.

Trân

+0

gì JDK bạn đang sử dụng? Oracle hoặc OpenJDK? –

+0

Orcale JDK trên Windows 7: phiên bản java "1.8.0_25", Java (TM) SE Runtime Environment (xây dựng 1.8.0_25-b18), Java HotSpot (TM) Máy khách (xây dựng 25,25-b02, chế độ hỗn hợp) – Stratehm

+0

Blog bài đăng bạn đã liên kết đến là re: openjdk. Chúng vẫn khác một chút. –

Trả lời

4

Cuối cùng, tôi đã thực hiện một chức năng readFully mà tôi sử dụng trong kịch bản của tôi (Chỉ tương thích với Nashorn):

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; 
} 
2

readFully không phải là một hàm JavaScript tiêu chuẩn và có khả năng không đạt tiêu chuẩn trong Nashorn một trong hai.

similar issues khi tê giác được chọn để đưa vào thực hiện Sun của Java 6. Công cụ tạo kịch bản có thể cung cấp các cải tiến không có trong API được nhúng. readFully không phải là chức năng được ghi lại trong Java 8 Nashorn API.

Trong các phiên bản trước của Java, đặc điểm kỹ thuật cho biết rằng các công cụ tạo kịch bản được cung cấp là chi tiết triển khai của nhà cung cấp JRE. Tôi không biết nếu Java 8 làm cho bất cứ điều gì về các công cụ cung cấp bắt buộc hoặc cho dù nó làm cho bất kỳ đảm bảo tương thích trong tương lai. Tôi sẽ kiểm tra kỹ lưỡng JSR-337 nếu điều này có thể là một vấn đề.

+0

Cảm ơn thông tin. Tôi sẽ tự mình thực hiện chức năng readFully. – Stratehm

1

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

readFully (-scripting chỉ mode)

Chức năng này đọc toàn bộ nội dung của một tập tin thông qua tại như một đối số chuỗi và gửi nó đến thiết bị xuất chuẩn, hoặc bạn có thể gán kết quả cho một biến .

readFully dụ:

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

+0

Vấn đề của tôi là readFully không được định nghĩa khi chạy qua API ScriptEngine. Không phải với jjs thực thi (theo cách này, tất cả đều ổn). – Stratehm

+1

Bạn có thể chuyển tùy chọn tới Nashorn bằng giao diện trực tiếp nashorn Nhà máy NashornScriptEngineFactory = new NashornScriptEngineFactory(); Chuỗi [] options = new String [] {"—scripting"}; NashornScriptEngine engine = factory.getScriptEngine (tùy chọn); hoặc chỉ cần đặt '#' làm ký tự đầu tiên của tập lệnh. – wickund

0

readFully được kích hoạt chỉ trong kịch bản chế độ.Nashorn docs

thử điều này:

>>jjs -scripting 
jjs> readFully("your_file") 
Các vấn đề liên quan