2011-09-19 20 views
5

Eclipse'de bir Bundle oluşturdum ve "Overview" sekmesi için "Framework'ü Başlat" bağlantısını kullandım. Paketimde bir arabirim (TestService) oluşturdum ve bunun için bir proxy oluşturması gereken kod (Helper'da). Ben Demet Activator Bu kodu arama ve almak:Bir OSGi Paketinde Javassist ClassPool'u nasıl oluşturur/başlatırsınız?

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

İlk ClassPool.get() doğru atar:

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

Testservice kamu ve aynı paket içinde ve İstisnayı yaratan Yardımcı olarak Bundle. Açıkçası, sadece "ClassPool.getDefault()" yapmak için yeterince iyi değil. Peki, ClassPool'un Bundle içindeki sınıfları görmesi için ne yapmam gerekiyor? Kendi paketlerimı almam mı gerekiyor?

+0

Javassist demetinin kendisinin yüklediğini sorduğunuz sınıfların görünürlüğüne ihtiyacı olacağını varsayalım. Maalesef, javasinin sınıfları nasıl gördüğünü bilmiyorum. Hangi classloader kullanacağını söyleyebilir misin yoksa sadece rastgele bir tahminde mi? Gerçek 'Class' nesnelerle yapılandırılabilir mi, yoksa Dizeler olarak sağlanan sınıf isimleri üzerinde mi ısrar ediyor? –

+0

Sadece Javassist ile başlıyorum, emin değilim, ama bu akşam kontrol edip size cevap vereceğim. Ancak, bu problemi zaten belirttiğinizi sanıyorum; OSGi bir Bundle'ın görebileceği paketleri sınırlar, bu yüzden kendi paketimi Javassist Paketinin "ithalat paketine" eklemek yeterli olabilir. –

cevap

2

Java sınıflarını değiştirmek/üretmek için bazı OSGi gruplarında javassist kullanıyorum. Sadece here'a bakabilirsiniz. Umarım size yardımcı olur.

+0

Kendi Paketinde Javassit ile çalışamadım çünkü dairesel bir bağımlılık alıyorum, ama Bundet'deki Javassit kavanozunu kodumla nasıl yerleştireceğimi anlamıyorum. Manuel olarak (Maven kullanmadan) gömme işleminin nasıl yapılacağı hakkında yararlı talimatlar bulana kadar çalışacağını "varsaymam gerekecek". –

+0

OSGi paketinizi oluşturmak için hangi aracı kullanıyorsunuz? Karınca? Http://www.aqute.biz/Bnd/Bnd aracını doğrudan yerleştirme kavanozuna ve paketi oluşturmak için kullanabilirsiniz. –

+0

Bnd kullanıyorum ama yeni başladı. "Uygulamada OSGi" okuyorum ve yazar Bnd kullanıyor. Ama bölüm 2'yi yeni bitirdim, böylece gömülme hakkında okumadım. Her neyse, bence bu benim için yanlış bir yaklaşım. Derleme zamanında "üretme" yi tam olarak bildiğimden beri, Javassist'i derleme zamanında kullanmam daha mantıklı olur. Bu, aynı zamanda sınıf yolu problemini çözerken daha az çalışma bağımlılığı yapar. –

10

"kaynak" Böyle ClassPool bir, siz "sınıf" tekabül edebilir bir OSGi paket classloader tarafından yüklenen nesne (veya classloader), ise:

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

ya sizin durumda sadece

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

Yardım edin.

İlgili konular