2013-02-28 29 views
7

Tôi muốn có trao đổi mã nóng giữa các cập nhật dự án, nhưng tôi chưa tìm thấy bất kỳ thông tin nào về cách tải tệp .class một cách động. Cụ thể hơn, tôi muốn một cái gì đó như thế:Trao đổi mã nóng clojure cho uberjars/.classes

  1. Làm lein uberjar, lấy some-client-0.0.0-standalone.jar.
  2. Chạy với java -jar some-client-0.0.0-standalone.jar.
  3. Thực hiện thay đổi đối với dự án. Nhận phiên bản chương trình mới, some-client-0.0.1-standalone.jar, sao chép nó vào thư mục some-client-0.0.0-standalone.jar.
  4. Khách hàng nhận được chuỗi các lệnh cần thiết để cập nhật lên phiên bản mới.
  5. (tùy chọn) Cập nhật tài nguyên. Tài nguyên từ bình cũ không còn được sử dụng nữa.
  6. (tùy chọn) some-client-0.0.0-standalone.jar có thể bị xóa ngay bây giờ.
+2

Tôi nghĩ rằng việc khởi động lại máy khách sẽ dễ dàng hơn ** ** nhiều hơn. Tại sao bạn không thể khởi động lại nó? –

+2

@NikitaBeloglazov Nếu đó là về tải mã trong khi phát triển, tôi sẽ tải nóng nguồn hoặc khởi động lại. Nhưng tôi muốn nhận được một cái gì đó giống như trao đổi mã nóng erlang cho ứng dụng của khách hàng. Và có, tôi biết rằng nó không phải là tốt và có thể dễ dàng sụp đổ chương trình của tôi, nhưng đó là một cái gì đó tôi muốn thử. – desudesudesu

Trả lời

2

Để tải lại tại thời điểm chạy đúng từ tệp jar bạn có thể cần xem xét OSGi class loaders. Đối với mã Clojure bạn có thể bắt đầu nrepl trong ứng dụng của bạn mà lắng nghe trên một cổng địa phương và sau đó khi bạn muốn tải lại mã bạn kết nối với cổng đó và thực hiện cuộc gọi đến load-file

+0

Tôi sẽ thử cái đó. Ví dụ thành công khi sử dụng nó trong clojure có thể hữu ích. – desudesudesu

5

Plug-in tiếp cận khung

Bạn đã nói rằng bạn muốn trao đổi mã nóng, nhưng những gì bạn thực sự cần là các mô-đun được ghép lỏng lẻo và khả năng thực hiện giải quyết trong thời gian chạy. Thành thật mà nói bất kỳ khung trình cắm nào có thể giúp, bao gồm cả OSGi trưởng thành (sẽ được trình bày bên dưới).

enter image description here

Vì bạn đang làm một số loại PoC Tôi đề nghị xem xét ví dụ sau:

  1. bạn có một ứng dụng meta với một số các điểm mở rộng (metaphor explanation) được xác định
  2. chức năng để được nâng cấp hoặc thay thế sẽ được triển khai dưới dạng mô-đun được ghép nối lỏng lẻo (plugin)
  3. ứng dụng meta thực hiện giải quyết theo yêu cầu hoặc tự động để tìm "chức năng" được cập nhật (Theo các điểm mở rộng định nghĩa)

Có xác định simlle nâng cấp kịch bản có thể được đề xuất:

  1. người dùng sử dụng một ứng dụng
  2. người dùng cài đặt (bản sao) một JAR (loại khác bó) với triển khai mới một hoặc nhiều điểm mở rộng
  3. người dùng kích hoạt hệ thống toàn cầu giải quyết hoặc quét hệ thống để cập nhật mới hoặc thực hiện hệ thống giải quyết mọi người dùng dùng thử truy cập một số chức năng

Theo cách như vậy, ứng dụng meta sẽ có thể cung cấp chức năng mới hoặc cập nhật mà không cần khởi động lại.Vì vậy, bạn có thể:

  1. thử sử dụng một số plug-in khuôn khổ đơn giản java (như, ví dụ, Java Simple Plugin Framework. 5 minutes and it works. No XML. Cách tiếp cận này có vẻ là một chút xấu xí
  2. sử dụng động bản chất của clojure, như đã được đề xuất here

Bạn cũng có thể xem xét và thông qua Waterfront (Clojure dựa biên tập viên cho Clojure) phát hiện (nó có thể là cần thiết để tăng cường quản lý vòng đời, vv)

Trong điều kiện thực hiện, Waterfront được dựa trên bối cảnh mẫu. Nó cho phép xử lý sự kiện để giao tiếp theo cách chức năng (tác dụng phụ miễn phí). Trên hết, cơ chế của trình tải plugin tải các plugin được chỉ định trong tệp cấu hình của Waterfront. Điều này có nghĩa là chức năng có thể dễ dàng được thêm hoặc bị xóa (cực kỳ hữu ích khi gỡ lỗi!).

cách tiếp cận OSGi

Như đã gợi ý OSGi có vẻ là một cách tốt để giải quyết vấn đề của bạn. cũng xin lưu ý OSGi là tốt, trưởng thành và cung cấp một công cụ rất nhiều ra khỏi hộp, nhưng nó cũng có phần phức tạp:

enter image description here

BTW, OSGi là một mục tiêu lâu dài cho cộng đồng clojure. Bạn có thể kiểm tra Clojure Todo:

> better modularization for OSGi etc 
> * names 
> * no single namespace pool 
> * namespaces found via classes, thus tracks classloader and modules 
> * deal with import proxying a la Class.forName stack walk? 

Có một số giải pháp đã có sẵn:

  1. clojure-osgi-utils
  2. clojure.osgi

dự án thứ hai cung cấp ví dụ sản xuất-tiêu dùng sử dụng clojure và OSGi:

Chúc mừng mã hóa.

+0

http: // stackoverflow.com/questions/1810231/define-a-spi-in-clojure - Tôi đã thử (trong khi đúng (Thread/sleep 5000) (load "/ class_that_changes") (println (eval 'class_that_changes/hello)) (eval' (chass_that_changes/hello))). Nó tải lại .clj, nhưng không tải lại các tệp .class. class_that_changes/hello points cho cùng một đối tượng. Tôi có làm sai không? jspf - Có thể là một tùy chọn, nhưng điều đó đòi hỏi phải viết những thứ trong Java. Tùy chọn Java interop vẫn là một lựa chọn. – desudesudesu

+1

Và clojure.osgi không phải là dự án lein, và điều đó làm tôi buồn. – desudesudesu

+0

bờ sông sử dụng tệp tải, trong đó "Đọc tuần tự và đánh giá tập hợp các biểu mẫu chứa trong tệp". '' .clj'', một lần nữa, không phải '' .class''. – desudesudesu

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