2013-07-11 36 views
6

Tôi muốn biết kích hoạt "Kích hoạt trình cắm thêm này khi một trong các lớp của nó được nạp" trong trình biên tập biểu hiện Eclipse có ích cho điều gì.Kích hoạt lười biếng các plugin Eclipse

Tôi nghĩ Eclipse luôn sử dụng cách tiếp cận "khởi tạo lười biếng". Có tùy chọn này liên quan đến lớp BundleActivator của plugin không? khởi tạo một cái gì đó khác với kích hoạt?

Here là một câu hỏi tương tự, nhưng tôi không hiểu nó hoàn toàn.

Trả lời

15

Ticking hộp gây tiêu đề sau đây để được thiết lập trong biểu hiện:

Bundle-ActivationPolicy: lazy 

Tôi sẽ bắt đầu với cách "tinh khiết" giao dịch OSGi với điều này. NẾU gói được bắt đầu với cờ START_ACTIVATION_POLICY thì gói đó đi vào trạng thái STARTING nhưng phương thức start() của trình kích hoạt không được gọi và một Trình nạp lớp không được cấp phát cho gói. Gói vẫn ở STARTING cho đến khi, vì lý do gì đó, một lớp cần được tải từ gói. Tại thời điểm đó một ClassLoader được cấp phát và bộ kích hoạt (nếu có) được khởi tạo và phương thức start() của nó được gọi trước khi lớp được yêu cầu được nạp.

Tuy nhiên, Eclipse thêm các ngữ nghĩa bổ sung ở trên cùng. Là nền tảng, Eclipse luôn cố tránh các gói bắt đầu để giữ thời gian khởi động tối thiểu. Một nhóm các gói lõi rất nhỏ được khởi động theo mặc định (danh sách nằm trong cấu hình/config.ini) và một trong số này được gọi là p2 "simpleconfigurator". Trình cấu hình đơn giản tìm các gói có tiêu đề Bundle-ActivationPolicy:lazy và bắt đầu chúng với cờ START_ACTIVATION_POLICY ... do đó, các gói này sẽ bị "lười" bắt đầu như được mô tả ở trên.

Điểm quan trọng là tất cả các gói khác không chứa tiêu đề sẽ không được bắt đầu ở tất cả trong Eclipse. Chúng sẽ ở trạng thái RESOLVED, các trình kích hoạt của chúng sẽ không được gọi, và nếu chúng chứa bất kỳ thành phần dịch vụ khai báo nào thì chúng sẽ không được nạp. Điều này là do dịch vụ khai báo chỉ bao giờ xem xét các gói đang ở trạng thái HOẠT ĐỘNG hoặc BẮT ĐẦU.

Do đó, lý do chính để sử dụng tiêu đề là nếu chúng ta muốn viết một gói chứa các thành phần Dịch vụ khai báo cần làm việc theo Eclipse.

Trong các môi trường khác có không cần sử dụng tiêu đề. Hầu hết các ứng dụng OSGi bình thường chỉ đơn giản là bắt đầu tất cả các gói, thay vì cố gắng chọn lọc bắt đầu một tập con các gói. Lưu ý rằng điều này không có nghĩa là các ứng dụng OSGi không lo lắng về việc tải chậm! Dịch vụ khai báo đã hỗ trợ tải chậm mà không gây rối xung quanh với trình kích hoạt tải lớp của gói. Theo tôi, Eclipse nhận được điều này sai và đã thêm vào sự phức tạp không cần thiết cho vòng đời của bó. Tuy nhiên, nếu bạn đang chạy trong Eclipse thì bạn không còn cách nào khác ngoài hiểu và làm việc với giới hạn của nó.

+0

Câu trả lời hay. Tôi vẫn còn vài câu hỏi. 1) Khi tôi đặt một plugin trong cấu hình sản phẩm thành autoStart: true, sau đó nó sẽ được bắt đầu không phụ thuộc vào tiêu đề Bundle-ActivationPolicy? 2) Điều gì bắt đầu có nghĩa là gì? Bạn nói "họ sẽ không được bắt đầu chút nào". Plugin có thể hoạt động như thế nào khi nó không được khởi động? – Behnil

+1

1) Có. 2) Bắt đầu có nghĩa là trình kích hoạt của gói được gọi và các thành phần DS được tạo/quản lý. Gói không bắt đầu (tức là RESOLVED) vẫn có thể cung cấp phụ thuộc, ví dụ: các gói xuất có thể được tải bởi các gói khác. Điều này rất hữu ích cho những thứ như thư viện thụ động. –

+0

Nhân tiện, DS bạn đang nói đến. Họ là tất cả những điểm mở rộng như đóng góp trình đơn, phần đóng góp bàn làm việc vv?Bởi vì khi tôi tạo một plugin đóng góp một khung nhìn cho một phối cảnh và không đặt nó thành Bundle-ActivationPolicy: lười, khung nhìn vẫn còn nhìn thấy được !? – Behnil

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