2012-04-07 17 views
13

Khi tôi chạy đoạn mã sau, biến số engine được đặt thành null khi tôi đang sử dụng OpenJDK 7 (java-7-openjdk-i386).Cố gắng sử dụng Rhino, getEngineByName ("JavaScript") trả về null trong OpenJDK 7

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

public class TestRhino { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     ScriptEngineManager factory = new ScriptEngineManager(); 
     ScriptEngine engine = factory.getEngineByName("JavaScript"); 
     try { 
      System.out.println(engine.eval("1+1")); 
     } catch (ScriptException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

Chạy tốt với java-6-openjdk và Oracle jre1.7.0. Bất kỳ ý tưởng tại sao?

Tôi đang sử dụng Ubuntu 11.10. Tất cả các JVM được cài đặt theo /usr/lib/jvm.

+0

Xem thêm [Javascript động cơ không thể tìm thấy] (http://stackoverflow.com/questions/6089773); Các nhà cung cấp JDK có thể chọn những công cụ kịch bản để đóng gói, nếu có. – McDowell

+0

thú vị, jdk 7 có cùng một vấn đề đối với tôi trên debian. jrunsript của jdk6 chạy động cơ javascript và jdk 7 jrunsript in "động cơ cho js ngôn ngữ không thể tìm thấy". – josefx

+0

Lưu ý: Bạn không thể chắc chắn rằng một công cụ tập lệnh cụ thể có sẵn. Nếu bạn _really_ cần nó, mang theo nó. –

Trả lời

3

[Cập nhật: Đây là một lỗi, trong đó có hiện been fixed]

Nói tóm lại, đây có thể là một lỗi.

lớp hỗ trợ Rhino (com.sun.script.javascript.*) không được biên dịch vào rt.jar (mặc dù tôi tìm thấy tài liệu tham khảo này là một vấn đề sáp nhập giữa Sun và Mozilla, và tôi biết đã có vấn đề không gian tên, họ tồn tại trong OpenJDK 7 nguồn và được tham chiếu trong makefile) và chúng cũng bị thiếu trong số's META-INF/services. Đây không phải là trường hợp với OpenJDK 6, trong đó có điều này như một mục META-INF/services/javax.script.ScriptEngineFactory:

#script engines supported 

com.sun.script.javascript.RhinoScriptEngineFactory #javascript 

Mặc dù điều này có thể là một quyết định distro không có lý do bằng văn bản cho nó, vì vậy tôi đã đệ đơn bug #982501 in the Ubuntu OpenJDK 7 launchpad. Sẽ cung cấp cho một câu trả lời tốt hơn một khi tôi nhận được một.

1 theo this thread,

Tôi đã nghe đâu đó rằng Mozilla đã không chấp nhận thay đổi vào Suns chi nhánh đường chính của họ không rõ lý do nhưng đó là trước khi được opensourced.

Cũng có một số sự cố xung đột gây ra bởi các phiên bản JRE xung đột và phiên bản BYOR (mang-bạn-riêng-tê giác) (ví dụ: bug #255149 on Ubuntu OpenJDK 7 launchpad). Tuy nhiên, nguồn là trong OpenJDK 7 source và được đề cập trong các makefile, và cổng BSD, được đề cập trong chủ đề trên, có giống hệt nhau sources.

2 Theo Sun bug #6876736 này, đây là một quyết định distro dựa trên:

Nguồn tê giác không phải là một phần của OpenJDK, nó tùy thuộc vào các distro để thêm vào.

Hơi trái ngược với thực tế là họ đã đăng ký vào OpenJDK mercurial, nhưng tôi nghĩ ý tưởng là Rhino không có trong đặc tả JDK.

+1

Cố định trong 7 ~ u3-2.1.1 ~ pre1-1ubuntu2 – Yuval

0

Bạn phải đăng ký dịch vụ tê giác, nhưng tôi không biết chính xác như thế nào, là bằng cách tạo ra một tập tin bên trong META-INF

HOẶC Bạn có thể bỏ qua các API Script và sử dụng nó trực tiếp.

Kiểm tra ví dụ cơ bản này:

https://github.com/mozilla/rhino/blob/master/examples/Control.java