2013-07-31 1 views
5

私はエンドユーザー向けのソフトウェアプログラム(uberjarとして)を開発していることを考慮して、ユーザーがプラグインをダウンロードして実行時にロードできるようにするために、 。ランタイムに読み込まれるプラグインのアーキテクチャ

プラグインはソースコードなしでコンパイルされている必要があります。 loadのようなものはオプションではありません。 これを構築するために既存のライブラリ(またはJavaの方法...)が存在しますか?

編集:あなたがよく分からない場合は、メインプログラムの再起動/起動の費用もかかります。しかし、重要なことは、ソースコードがJARファイルに含まれないことです(メインアプリケーションもプラグインjarでもなく、Leiningenドキュメンテーションのomit-sourceを参照してください)。

答えて

1

私は自分で試したことはありませんが、理論的にはOSGiをClojureと連携させる必要があります。

のClojure/OSGiの統合ライブラリがここにあります:

+0

OSGiはJavaのやり方だと思われます。 githubリポジトリは実際には文書化されておらず、ソースコードを見ると非常にハッキリです。私がOSGi用のラッパーを書くつもりはない。 –

1

私はロールに自分のソリューションをしようとしたら、私はプラグインをロードおよびアンロードするtools.namespaceを使用しようとするだろう。私はそれがうまくいくかどうかは完全にはわかりませんが、確かに正しい方向です。 1つの重要な点は、プラグインのjarファイルが既にクラスパス上にある場所にインストールされている必要があるということです。

ここでも、これは1つの可能な解決策の始まりに過ぎません。私はこれをやってみたことがありません。

+0

ソースコードがJARに含まれていないときにtools.namespace.findが動作するかどうか確認してください。 –

+0

私は試していませんが、READMEにはtools.namespaceと書かれています。ディレクトリやJARファイルのファイルシステム上でClojureネームスペースを検索するためのユーティリティが含まれています。java.classpathと組み合わせると、Javaクラスパス上のネームスペースを検索できます。 – Jeremy

+0

残念ながら、ソースなしのJARファイルには名前空間が見つかりません: –

4

実行時にjarファイルを追加するには、pomegranateを使用します。このファイルを使用すると、.jarファイルをクラスパスに追加できます。お使いのソフトウェアのプラグインは、あなたが確立する必要がある特定の規則に従って定期的にClojureのLIBSのようになります。

  1. は彼らが提供してください(例でedn)などLifecycleとして、コンストラクタ/デストラクタメカニズムを実装するオブジェクトへのシンボルプロトコル:Stuart Sierras ライブラリー。実行時にはrequireresolveというシンボルが表示され、結果のオブジェクトはstartになり、プログラムのプラグインの調整機能が残ります。

  2. プラグインが非同期的に調整する方法でプラグインと対話できるパブリックAPIをプログラムに用意します。 g。 clojure.core.async(1つのプラグインがプログラム全体をブロックしないようにしてください)。

  3. プラグイン間で高度なモジュール性を有効にしたい場合にのみ、プラグインが機能を互いに公開するように調整されていることを確認してください。プラグイン・ローダーがプラグイン間の依存関係を検出できることを確認し、正しい順序でロードおよびアンロードすることができます。

関連する問題