2011-08-09 25 views
6

Tôi đang gặp sự cố khi Rhino ném ngoại lệ "Encountered code generation error while compiling script: generated bytecode for method exceeds 64K limit" khi chạy Rhino qua API javax.script.ScriptEngine. Giải pháp được chấp nhận dường như là gọi số setOptimizationLevel(-1) trên số sun.org.mozilla.javascript.Context.Có thể thiết lập mức tối ưu hóa cho RhinoScriptEngine trong Java 6 không?

Thật không may, tôi dường như không thể truy cập vào số Context được tạo bởi ContextFactory. Tôi đã thử thêm ContextFactory.Listener vào ContextFactory.getGlobal() để sửa đổi Context sau khi tạo, nhưng người nghe của tôi dường như không bao giờ được gọi. Tôi cũng đã xem qua số RhinoScriptEngine source from Java 6 để xem liệu có một thuộc tính mà tôi có thể đặt là ContextFactory sẽ đọc từ để xác định giá trị của cấp tối ưu hóa hay không.

Theo như tôi có thể nói, trong Java 7, RhinoScriptEngine thiết lập mức độ tối ưu hóa để -1 theo mặc định làm cho nó có thể thiết lập mức độ tối ưu hóa thông qua rhino.opt.level tài sản. So sánh phương pháp makeContext() trong Java 7 version với phương pháp makeContext() trong Java 6 version để xem ý tôi là gì.

Theo như tôi có thể nói, tôi tin rằng tùy chọn tốt nhất của tôi là chạy Rhino trực tiếp, như được hiển thị in this example of using Rhino to run the CoffeeScript compiler. Mặc dù bạn có thể thấy, mã này rất lộn xộn hơn, vì vậy tôi muốn sử dụng API javax.script.ScriptEngine, nếu có thể, trong khi tiếp tục hỗ trợ Java 6. Có tùy chọn nào khác không?

+0

Một lựa chọn khác là để sao chép tất cả các mã từ com.sun.script. gói javascript vào một gói mới (hoặc có thể cùng một lớp với các lớp được đổi tên thành thành viên truy cập gói riêng) và thay đổi việc thực hiện makeContext() để đặt mức tối ưu hóa, nhưng điều đó có vẻ như quá mức cần thiết. – bolinfest

+0

Tôi đã gặp vấn đề tương tự. 'Nashorn' trong JDK8 là một công cụ JS nâng cao hơn, Nashorn có thể giải quyết vấn đề 64K. –

Trả lời

2

Không, theo các tài liệu: http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html#jsengine

đâu nó nói:

Một vài thành phần đã được loại trừ do dấu chân và an ninh lý do:

  1. JavaScript để biên dịch-bytecode (còn được gọi là "trình tối ưu hóa"). Tính năng này phụ thuộc vào thư viện tạo lớp. Việc xóa tính năng này có nghĩa là JavaScript sẽ luôn được diễn giải. Việc xóa tính năng này không ảnh hưởng đến việc thực thi tập lệnh vì trình tối ưu hóa là trong suốt.

Lớp ưu đã được loại trừ cho bundling nó với JDK6 do đó mức độ tối ưu hóa không thể được đặt cho java 6.

+0

Nhưng isn 't rằng tương đương với một mức tối ưu hóa -1, đó là những gì OP muốn? Các lỗi biên dịch tạo mã chắc chắn không nên xảy ra trong Java 6 nếu nó luôn được diễn giải. – bacar

1

Tôi đang chạy với 6 và nó cũng có vẻ được đặt thành -1 theo mặc định. Hay đúng hơn, trừ khi sun.org.mozilla.javascript.internal.optimizer.Codegen nằm trên đường dẫn lớp, nó được đặt thành -1.

+0

Hmm, một vấn đề có thể là tôi đang sử dụng OpenJDK: $ java -version phiên bản java "1.6.0_22" Môi trường chạy OpenJDK (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1 ~ 11.04.1) OpenJDK 64-Bit Server VM (xây dựng 20.0-b11, chế độ hỗn hợp) Mặt trời JDK dường như có một số khác biệt xung quanh Rhino. Chúng tôi đã phải làm một số điều khá lạ để có được những thứ để làm việc trên cả hai JDK cho dự án của tôi, plovr: http://code.google.com/p/plovr/source/detail?r=7e3cad7f1b9d – bolinfest

Các vấn đề liên quan