Nhóm của tôi hiện đã biên dịch và thực thi Scala làm việc cho Scalate trong OSGi.
Nói chung, cài đặt ScalaCompiler nên được cung cấp cùng với một tập hợp các đối tượng AbstractFile tương ứng với các gói OSGi liên quan. Điều này được hỗ trợ bởi Guggla như được tham chiếu bởi @michid. Nhưng trong khi Guggla cung cấp lớp AbstractFile, nó vẫn chưa cung cấp bất kỳ ví dụ hoặc mã nào về cách tạo ra các cá thể AbstractFile trong một môi trường OSGi. Ví dụ mã để làm thứ hai có thể được tìm thấy trong các dự án Sling (nguồn gốc của Guggla chính nó) cũng như trong dự án Scalate (xem ScalaCompiler nhưng lưu ý thay đổi của chúng tôi để nó dưới đây).
Chúng tôi đã chọn gói scala OSGi-ified (compiler và library) từ dự án ServiceMix. Xem issue SMX-1048 (with patch) trên gói scala-compiler.
Mục đích ban đầu của chúng tôi là làm việc này ở Scalate và do đó phần còn lại của câu trả lời này là dành riêng cho dự án đó.
Mã Scalate đã có hầu hết logic cần thiết để hoạt động trong môi trường OSGi, bao gồm lớp AbstractFile ảo cũng như thiết lập đường dẫn lớp trình biên dịch. Tuy nhiên chúng tôi cần phải vá Scalate (https://github.com/scalate/scalate/pull/16) để làm cho nó làm việc:
1) OsgiCompiler ghi đè của lớp ScalaCompiler đã không được kích hoạt đúng cách, và do đó bó của đã không được phát hiện như là đầu vào classpath để trình biên dịch, và
2) Trình nạp lớp thực hiện mẫu (thời gian chạy) đã được thiết lập cho trình nạp lớp của gói lõi nhân, kết quả là thời gian chạy của CNFE.
Yêu cầu kéo trên cấu hình Scalate trong môi trường OSGi để mặc định cho trình nạp lớp ngữ cảnh chủ đề khi chạy. Điều đó có vẻ là cách dễ nhất để tham chiếu đến trình nạp lớp của người gọi mà không có người gọi phải tiêm nó một cách rõ ràng (ví dụ, một khai báo Spring-DM osgi:service
xuất một dịch vụ mẫu có thể sử dụng thuộc tính context-class-loader="service-provider"
để thiết lập điều này tự động. hành vi thời gian chạy của OSD Scalate tương ứng với hành vi biên dịch thời gian hiện tại đã sử dụng TCCL
Do đó một người gọi đến Scalate nên đặt TCCL thành trình nạp lớp của chính nó hoặc đưa vào trình nạp lớp mong muốn. templateEngine.classLoader = ...
trước khi thực hiện mẫu.
Cập nhật 31-Aug-2012: Bây giờ Scalate master chứa tất cả các bản vá lỗi được đề cập trong bài đăng này
Cập nhật 10 tháng 4 năm 2013: Scalate 1.6.1, với trình biên dịch mẫu thời gian chạy thông qua trình biên dịch Scala, tương thích với OSGi. Ngoài ra Scala 2,10 trở lên là các gói OSGi hợp lệ được phát hành.
Công cụ tạo kịch bản Scala của Apache Sling đã chuyển đến nhà riêng của mình tại https://github.com/guggla/guggla. Nó hiện đang trên Scala 2.9 nhưng nó không phải là quá khó khăn để làm cho nó làm việc với 2.9.1. Để biết thêm thông tin, hãy xem các trang trình bày của tôi http://people.apache.org/~mduerig/scala4sling/ và http://people.apache.org/~mduerig/scala4scripting/ – michid
@michid: Tuyệt vời, cảm ơn các liên kết. Sẽ điều tra thêm. – Raman