2012-01-20 34 views
8

Tôi đang sử dụng một công cụ mẫu Scala (Scalate) để biên dịch các mẫu tại thời gian chạy trong môi trường OSGi (Scala 2.9.1). Các mẫu không thể được biên dịch trước vì chúng được xây dựng động.Làm cho trình biên dịch scala hoạt động bên trong một thời gian chạy OSGi

Để làm việc này, trình biên dịch Scala cần chạy trong môi trường OSGi. Tuy nhiên, kể từ khi trình biên dịch Scala không thể lấy một bộ nạp lớp như đầu vào, điều này không làm việc ra khỏi hộp.

Từ nghiên cứu của tôi, dường như có hai giải pháp chung cách tiếp cận:.

1) Một plugin trình biên dịch scala (there is one started here nhưng nó đã không được xúc động kể từ năm 2009, và messages on the scala list in 2009 tuyên bố đó là chưa sẵn sàng để sử dụng sản xuất

2) Tạo hệ thống tệp ảo ở phía trên cùng của ngữ cảnh gói mà sau đó có thể được trình biên dịch Scala sử dụng. Rõ ràng các kẻ sling Apache có successfully sử dụng phương pháp này trên một phiên bản cũ của Scala.

Có ai đã nhận Scalate, Scala 2.9.1 và OSGi để làm việc cùng nhau để tự động biên dịch mẫu không?

+1

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

+0

@michid: Tuyệt vời, cảm ơn các liên kết. Sẽ điều tra thêm. – Raman

Trả lời

3

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 (compilerlibrary) 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.

0

Tôi nghĩ bạn cần đặt chính sách bạn thân. Sau đây sẽ giúp.

http://wiki.eclipse.org/index.php/Context_Class_Loader_Enhancements#Buddy_Policy

http://www.eclipsezone.com/eclipse/forums/t90282.html

http://help.eclipse.org/indigo/topic/org.eclipse.platform.doc.isv/reference/misc/bundle_manifest.html

Trong bó của bạn, bạn có thể nói rằng bạn cần phải sử dụng bộ nạp lớp giống như bó khác.

+0

Vấn đề không phải là một trong những khả năng hiển thị lớp, do đó tôi không nghĩ rằng câu trả lời này là có liên quan. – Raman

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