2011-01-14 25 views
5

Tôi đang cố gắng hiểu cách bánh thực hiện nhiều phương pháp JVM của nó. Ở cấp độ cao, tôi nghĩ rằng chiếc bánh đó hoạt động tương tự như súng ngắn, trong đó có một cá thể JVM (một quy trình JVM) và các "JVM" mới cho các dự án khác nhau thực sự chỉ là các đinh/bình được đánh giá trong một trình nạp lớp mới (cùng với các phụ thuộc jar khác nhau), mà trong mắt tôi không phải là một cá thể JVM mới. Tuy nhiên, từ What's the difference between Cake and Leiningen?, có một ngụ ý rằng có nhiều JVM (một cho bánh và * cho các dự án), không chỉ là một cá thể JVM duy nhất.Tính năng JVM liên tục được triển khai trong bánh như thế nào?

Nếu có các trường hợp JVM mới được tạo, tốc độ tăng đến từ đâu? Với sự hiểu biết của tôi, tôi sẽ lý do rằng việc bắt đầu một JVM mới ngụ ý việc tạo ra một quy trình JVM mới mà phát sinh cùng chi phí khởi động như bình thường.

Nếu không có, phụ thuộc gốc được thêm vào như thế nào? Từ những gì tôi hiểu, JVM chỉ biết về các phụ thuộc gốc từ các đối số dòng lệnh được truyền trước khi chạy. Cách duy nhất tôi biết làm thế nào để phá vỡ này là với một Sun/Oracle JVM thực hiện cụ thể hack được liệt kê dưới đây.

(let [clazz java.lang.ClassLoader 
     field (.getDeclaredField clazz "sys_paths")] 
    (.setAccessible field true) 
    (.set field clazz nil) 
    (System/setProperty "java.library.path" (apply str (interpose ";" native-paths)))) 

Trả lời

4

Bánh có tập lệnh Ruby khởi động và quản lý JVM. Ruby không có phí JVM, vì vậy kịch bản lệnh Ruby có thể tạo các JVM và sau đó khi bạn thực hiện các lệnh, kịch bản lệnh Ruby sẽ ủy nhiệm các lệnh đó cho các JVM.

Lý do hai JVM là cần thiết để phụ thuộc của bánh (bánh JVM) tách biệt với phụ thuộc của dự án (JVM nướng). Một số lệnh như cake repl chạy trong JVM nướng để tận dụng lợi thế của classpath của dự án.

Tuy nhiên, trong phiên bản mới nhất, chỉ có một JVM duy nhất cho mỗi dự án. Điều này có thể sử dụng các trình nạp lớp khác nhau trong cùng một JVM. Thư viện liên quan được sử dụng là classlojure. Ngay cả với hai phiên bản JVM, các JVM liên tục, có nghĩa là chúng chỉ sinh ra một lần và sau đó khởi động lại chỉ khi cần thiết, như trong trường hợp của classpath thay đổi (khi bạn thêm một phụ thuộc mới hoặc một cái gì đó tương tự). Tôi không chắc chắn lý do tại sao bạn nghĩ rằng điều này có nghĩa là phát sinh chi phí JVM mỗi khi một lệnh được thực thi. Ý tưởng là rất nhiều lệnh xảy ra ngay lập tức thay vì mỗi lệnh bắt đầu một JVM.

+1

Cảm ơn. OK, với phiên bản cũ, một JVM mới đã được tạo ra cho mỗi dự án, tôi đã bị ấn tượng sai, một lần nữa, nó giống như súng ngắn hơn, chỉ có một ví dụ JVM. Phương pháp phương pháp nailgun là lý tưởng trong tâm trí của tôi liên quan đến thời gian khởi động JVM và bỏ qua các vấn đề an ninh, mà tôi nhận ra bây giờ không phải là cách bánh được thực hiện. Tôi đã cố gắng để xác định lợi ích liên quan đến thời gian khởi động JVM trong các tình huống khi JVM cần khởi động lại hoặc tạo ra, không phải trên mỗi lệnh bánh. – bmillare

+0

Classlojure có hỗ trợ tải phụ thuộc vào thời gian chạy không? – bmillare

2

Raynes là chính xác. Kể từ bánh 0.6.0, có một JVM cho mỗi dự án. Bánh chạy trong trình nạp lớp chính và sử dụng classlojure để tải dự án trong một trình nạp lớp riêng biệt và tải lại nó khi đường dẫn lớp thay đổi. Chúng ta đã thảo luận một tùy chọn ~/.cake/config chung để chia sẻ một JVM duy nhất trong số tất cả các dự án. Nó không nên quá khó để thêm điều này bằng cách sử dụng classlojure. Vấn đề chính với cách tiếp cận này là làm thế nào để giữ các plugin nhiệm vụ bánh riêng biệt. Có lẽ dự án bánh toàn cầu có thể chạy trong bộ nạp lớp chính và mỗi dự án có thể nhận được hai bộ nạp lớp (một cho bánh và một cho dự án).

Đối với phụ thuộc gốc, classlojure không hỗ trợ thêm chúng sau khi JVM khởi động. Một bản vá để thêm chức năng này sẽ được chào đón miễn là đường dẫn thư viện gốc là cục bộ cho một trình nạp lớp cụ thể và không được chia sẻ giữa tất cả các trình nạp lớp trong cùng một JVM.

+0

Hai yêu cầu cuối cùng mà bạn đề cập, thật không may, về cơ bản là không thể đáp ứng (với kiến ​​thức của tôi). Ngoài ra, mã tôi đưa ra ở trên sẽ bị hỏng nếu điều này được chạy với các triển khai JVM khác nhau. – bmillare

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