2011-09-19 9 views
5

Utworzono pakiet w środowisku Eclipse i skorzystałem z linku "Uruchom program" w zakładce "Przegląd". W moim pakiecie utworzyłem interfejs (TestService) i kod, który powinien wygenerować dla niego proxy (w Helper). Ja nazywam to kod w Activator wiązki, a otrzymasz:Jak utworzyć/zainicjować Javassist ClassPool w pakiecie 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) 

To rzuca w prawo na pierwszym ClassPool.get():

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

TestService jest publiczny i w tym samym opakowaniu, a Pakiet, jako pomocnik, który generuje wyjątek. Oczywiście, nie wystarczy po prostu "ClassPool.getDefault()". Co więc muszę zrobić, aby ClassPool widział klasy w pakiecie? Czy muszę importować własne pakiety?

+0

Zakładam, że sam pakiet javassist będzie wymagał widoczności klas, o które prosisz go załadować. Niestety nie wiem, jak javassist sprawdza klasy. Czy możesz powiedzieć, który program ładujący klasy powinien użyć, lub czy po prostu zgaduje? Czy można go skonfigurować za pomocą rzeczywistych obiektów "Class", czy też nalega na nazwy klas dostarczane jako ciągi znaków? –

+0

Po prostu zaczynam od Javassist, więc nie jestem pewien, ale sprawdzę ten wieczór i odpowiem. Ale podejrzewam, że wskazałeś już na ten problem; OSGi ogranicza pakiety, które widzi Pakiet, więc może wystarczyć dodanie własnego pakietu w "pakiecie importu" Pakietu Javassist. –

Odpowiedz

2

Używam javassist w niektórych pakietach OSGi do modyfikowania/generowania klas Java w locie. Możesz po prostu wyglądać here. Mam nadzieję, że ci to pomoże.

+0

Nie mogłem go uruchomić z Javassitem w jego własnym pakiecie, ponieważ otrzymuję zależność cykliczną, ale po prostu nie rozumiem, jak osadzić słoik Javassit w pakiecie z moim kodem. Po prostu muszę "założyć", że to działa, dopóki nie znajdę użytecznych instrukcji, jak ręcznie wykonać osadzanie (nie używając Mavena). –

+0

Z jakiego narzędzia budujesz swój pakiet OSGi? Mrówka? Możesz użyć narzędzia http://www.aqute.biz/Bnd/Bnd bezpośrednio do osadzenia słoika i utworzyć pakiet. –

+0

Używam Bnd, ale po prostu zacząłem. Czytam "OSGi w praktyce", a autor używa Bnda. Ale właśnie skończyłem rozdział drugi, więc nie czytałem o osadzaniu. W każdym razie myślę, że to dla mnie niewłaściwe podejście. Ponieważ wiem dokładnie, co powinienem "wygenerować" w czasie kompilacji, bardziej sensowne byłoby dla mnie używanie Javassist w czasie kompilacji. To spowoduje mniejszą zależność od czasu wykonywania, jednocześnie rozwiązując problem z klasą klasu. –

10

Jeśli "source" to obiekt załadowany przez classloader OSGi wiązki, można odpowiedni "ścieżki klasy" (lub classloader) do ClassPool, tak:

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

lub w danym przypadku po prostu

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

Mam nadzieję, że to pomaga.