3

[明確化] 最初の説明が明確でないことをお許しください。質問を言い換えさせてください。

バンドルの依存関係とセキュリティ制約を理解する、OSGi で使用可能な API を使用してランタイムコンパイルを実行する方法はありますか(ここでもruntimeを強調します)。javax.tools

[更新] https://github.com/rotty3000/phidiasをご覧ください

これはよくできた OSGi バンドルです。readme には、非常に小さな 4 クラス API (8k モジュール) のすべての詳細が記載されています。

4

4 に答える 4

0

確かに、JavaCompilerにコンパイルするための適切なクラスを提供するカスタムJavaFileManagerを作成する必要があります。

たとえば、OSGiランタイムからクラスを取得するものを作成できます。コンパイラバンドルから必要なライブラリへの依存関係を気にしない場合は、非常に簡単です。それ以外の場合は、wiringapiを使用して他のバンドルを探すこともできます。(OSGi 4.3以降のみ)。コンパイル中に要求するパッケージをインターセプトすると、Package-Importステートメントを生成できるため、バンドルを生成できます。

数か月前にGitHubの大まかな例を作成しました。

https://github.com/flyaruu/test-dynamic-compiler

いくつかの問題がありました(たとえば、Eclipse ecjコンパイラを動作させることができませんでした。バンドルのセキュリティについてはまったく調べていませんでした。また、OSGiの動的な性質により、コンパイルパスを更新するためにバンドルの変更をリッスンする必要があります。 。)、しかしそれはうまくいきます。

于 2012-09-16T21:46:23.457 に答える
0

私はこれまでのところ、本当の答えは「いいえ、ありません!」であることがわかりました。

現在Javaの主なランタイムコンパイルシナリオはJSPコンパイルです。私がレビューする機会があったアプリサーバーの調査では、次のいずれかの方法を使用します。

  • javac(システムコールを介した)の呼び出し
  • ecj/jdtの使用
  • javax.toolsOSGiに対応していない方法で使用する

これらのアプローチはすべて、ファイルシステム内のjarまたはクラスを直接イントロスペクトすることによって使用可能なクラスパスを収集することに基づいています。

現在のアプローチはいずれも、環境の動的な性質やフレームワーク自体に課せられた根本的な制限などのOSGiの特性を認識していません。

于 2012-09-16T02:31:02.410 に答える
0

パッケージのインポートとエクスポートのセットから、コンパイルに使用できるバンドルのリストを取得するには、ある種の候補バンドルのリポジトリと、どのバンドルがどのパッケージを最適に提供するかを判断するためのプロビジョナーが必要です。「Require-Bundle」を使用している場合 (ベスト プラクティスではありません)、バンドル名はわかりますが、必ずしもバージョンはわからないため、いくつかのプロビジョニングが必要です。

たとえば、Eclipse PDE では、ターゲット プラットフォームがコンパイル用の基本リポジトリとして使用されます。また、 Eclipse の p2 プロビジョニングを使用してターゲット プラットフォームをプロビジョニングするなど、より高度なことを行うこともできるため、自分で設定する代わりに、外部の p2 リポジトリをリポジトリとして使用できます。コマンド ライン ビルドの場合、Tychoを使用すると、Eclipse 自体が使用するのと同じ種類のクラスパス解決メカニズムを Maven ビルドで使用できます。

別の方法として、「クラスパス」を Maven 依存関係としてリストし、maven バンドル プラグイン( bndに基づく) にマニフェストを生成させることもできます。

プログラムでコンパイルしているために既存のコマンド ライン ツールを利用できない場合 (解決しようとしている問題を質問から完全に明確にすることはできません)、おそらく既存のプロビジョニング テクノロジを利用することをお勧めします。 OBR、Eclipse p2、または Apache Ace などを使用して、コンパイル用のクラス パスに配置する必要があるバンドルを作成します。

于 2012-09-15T09:22:53.543 に答える
0

これはまさに bndtools で行っていることです...少し時間があれば、bnd にコンパイラを追加して、これも実行できるようにしたいと思います。

于 2012-09-15T12:15:51.740 に答える