2011-09-19 20 views
5

Tôi đã tạo một Gói trong Eclipse và sử dụng liên kết "Khởi chạy khung" cho tab "Tổng quan". Tôi đã tạo một giao diện (TestService) trong gói của tôi và mã sẽ tạo một proxy cho nó (trong Trình trợ giúp). Tôi gọi mã này trong Activator của Bundle, và nhận được:Làm thế nào để bạn tạo/khởi tạo Javassist ClassPool bên trong một gói OSGi?

Caused by: javassist.NotFoundException: com.test.services.TestService 
at javassist.ClassPool.get(ClassPool.java:436) 
at com.test.services.Helper.get(Helper.java:46) 

Nó ném ngay tại ClassPool.get đầu tiên():

ClassPool pool = ClassPool.getDefault(); 
CtClass result = pool.get(TestService.class.getName()); 
... 

TestService là công khai và trong cùng một gói, và Bundle, là người trợ giúp, tạo ra ngoại lệ. Rõ ràng, nó không đủ tốt để chỉ làm "ClassPool.getDefault()". Vậy tôi cần làm gì để ClassPool thấy các lớp bên trong Bundle? Tôi có phải nhập gói của riêng mình không?

+0

Tôi giả định rằng gói javassist chính nó sẽ cần khả năng hiển thị của các lớp bạn đang yêu cầu nó tải. Thật không may tôi không biết làm thế nào javassist nhìn lên lớp học. Bạn có thể nói nó sử dụng trình nạp lớp nào không, hoặc nó chỉ đoán ngẫu nhiên? Nó có thể được cấu hình với các đối tượng 'Lớp' thực tế hay không, hoặc nó có nhấn mạnh vào tên lớp được cung cấp dưới dạng Strings không? –

+0

Tôi mới bắt đầu với Javassist, vì vậy tôi không chắc chắn, nhưng tôi sẽ kiểm tra tối nay và trả lời bạn. Nhưng, tôi nghi ngờ bạn chỉ ra rằng vấn đề đã được; OSGi giới hạn các gói mà Gói có thể thấy, do đó, có thể là đủ để thêm gói của riêng tôi vào "gói nhập" của Gói Javassist. –

Trả lời

2

Tôi sử dụng javassist trong một số gói OSGi để sửa đổi/tạo các lớp Java khi đang di chuyển. Bạn chỉ có thể xem here. Hy vọng nó sẽ giúp bạn.

+0

Tôi không thể làm cho nó hoạt động với Javassit trong Bundle riêng của nó, bởi vì tôi nhận được sự phụ thuộc vòng tròn, nhưng tôi không biết cách nhúng bình Javassit vào Bundle với mã của tôi. Tôi sẽ chỉ phải "giả định" rằng nó hoạt động, cho đến khi tôi tìm thấy hướng dẫn có thể sử dụng về cách nhúng thủ công (không sử dụng Maven). –

+0

Bạn sử dụng công cụ nào để xây dựng gói OSGi của mình? Kiến? Bạn có thể sử dụng công cụ http://www.aqute.biz/Bnd/Bnd trực tiếp để nhúng jar và tạo nhóm. –

+0

Tôi đang sử dụng Bnd, nhưng chỉ mới bắt đầu. Tôi đang đọc "OSGi trong thực hành", và tác giả sử dụng Bnd. Nhưng tôi vừa kết thúc chương hai vì vậy tôi chưa đọc về việc nhúng. Dù sao, tôi nghĩ rằng đây là cách tiếp cận sai cho tôi. Vì tôi biết chính xác những gì tôi nên "tạo ra" tại thời gian biên dịch, nó sẽ có ý nghĩa hơn cho tôi để sử dụng Javassist tại thời gian biên dịch thay thế. Điều đó sẽ làm cho một phụ thuộc thời gian chạy ít hơn, trong khi giải quyết vấn đề classpath cùng một lúc .. –

10

Nếu "nguồn" là một đối tượng được nạp bằng một gói OSGi classloader, bạn có thể tương ứng "classpath" (hoặc classloader) đến ClassPool, như thế này:

pool.insertClassPath(new ClassClassPath(source.getClass())); 

hoặc trong trường hợp của bạn chỉ đơn giản là

pool.insertClassPath(new ClassClassPath(TestService.class)); 

Hy vọng điều đó sẽ hữu ích.