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 và 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?
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
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. –