2011-09-19 10 views
5

Eclipseでバンドルを作成し、[概要]タブの[フレームワークを起動]リンクを使用しました。私は自分のバンドルにインターフェース(TestService)を作成し、そのためのプロキシを生成するコードを(ヘルパーで)作成しました。私はバンドルのアクティベーターでこのコードを呼び出すと、取得:OSGiバンドル内でJavassist ClassPoolを作成/初期化するにはどうすればよいですか?

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

それは右の最初ClassPool.get(でスロー):

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

TestServiceは、公開と同じパッケージ内にあり、例外を生成するヘルパーとしてバンドルします。明らかに、「ClassPool.getDefault()」を実行するだけでは不十分です。 ClassPoolがバンドル内のクラスを見るためには、どうすればよいですか?自分のパッケージをインポートする必要がありますか?

+0

私は、javassistバンドル自体が読み込みを要求しているクラスの可視性を必要とすると想定します。残念ながら、私はjavassistがクラスをどのように見ているのか分かりません。使用するクラスローダーを教えてもらえますか、それともランダムな推測だけですか?それは実際の 'Class'オブジェクトで設定できますか、それともStringsとして提供されたクラス名を主張していますか? –

+0

私はJavassistで始まったばかりなので、私は確信していませんが、今晩チェックしてお答えします。しかし、私はあなたが既にその問題を指摘していると思う。 OSGiはバンドルが見ることができるパッケージを制限するので、Javassist Bundleの "import package"に私自身のパッケージを追加すれば十分でしょう。 –

答えて

2

OSGiのバンドルでjavassistを使用して、Javaクラスを変更/生成しています。 hereと見ることができます。それがあなたを助けることを願ってください。

+0

循環型依存関係があるので、Javassitを自分のBundleで動作させることができませんでしたが、Javassit jarをBundleにコードを埋め込む方法はありません。手動で埋め込み(Mavenを使用しない)のやり方に関する有用な指示が見つかるまで、それが動作することを「仮定」しなければなりません。 –

+0

OSGiバンドルのビルドにはどのツールを使用しますか?蟻? http://www.aqute.biz/Bnd/Bndツールを直接使用してjarを埋め込み、バンドルを作成することができます。 –

+0

私はBndを使用していますが、始めました。私は「OSGi in Practice」を読んでおり、著者はBndを使っています。しかし、私は第2章を終えたので、埋め込みについては読んでいません。とにかく、これは私にとって間違ったアプローチだと私は思う。私がコンパイル時に "生成する"ものを正確に知っているので、代わりにコンパイル時にJavassistを使用する方が意味があります。これはランタイム依存性を少なくし、同時にクラスパスの問題を解決します。 –

10

「ソースは、」このようなClassPoolに、あなたは「クラスパス」に対応することができますOSGiバンドルのクラスローダによってロードされたオブジェクト(またはクラスローダ)の場合:

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

またはあなたのケースでは、単に

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

希望します。

関連する問題