0

私は友人グループと一緒にソフトウェアを書き始め、Java 言語を選択しました。

Java の単一クラスパスの問題を解決するために、OSGi を使用することにしました。このプロジェクトには、Spring DM、Hibernate、および CXF DOSGi を使用しました。

物事を機能させるには多くの努力が必要でした。たとえば、Spring アノテーションを使用してトランザクションをマークしたかったのですが、これは非常に困難な作業でした。多くのClassNotFoundExceptions を取得し、それらを解決するために、必要な理由を正確に知らずに import-package セクションにインポートを追加しました (これらは主に Spring パッケージでした)。

プロセスを経た後、間違った言語を選択したのではないかと思いましたか?

だから私の質問は:

  1. Java のように単一のクラスパスの問題がない言語は何ですか?

  2. それらの言語はどのように問題を解決しますか?

  3. Java を使用するのではなく、これらの言語を使用することに何か短所はありますか (それらを学ばなければならないという事実を除いて)?

4

1 に答える 1

4

問題は言語ではありません。あなたの問題は、テクノロジーが非常にモジュール化されていないことです。OSGi は、ライブラリや秘密のソースではありません。追加すると、魔法のようにモジュール性のすべての利点が得られます。その中には、必要な複数の「クラス スペース」があります。OSGi は、モジュラー アプリケーションのファブリックを提供します。つまり、アプリケーションは、まとまりのある最小限に結合されたコンポーネントから構築されます。

Spring や Hibernate など、人気はあるがモジュール化されていないテクノロジを選択しました。これらのテクノロジは、動的クラス ローディング (Class.forName) を広範囲に使用するため、単一のクラス空間に大きく依存しているため、モジュール化されていません。つまり、XML ファイル内の各クラス名は動的にロードされます。このパラダイムは、グローバル クラス スペースを必要とするだけでなく (これらのクラス名は実質的にグローバル変数として扱われます。これは、CS の学生なら誰でも知っているはずです)、実装クラスの名前も使用します。モジュールの外側で実装クラスの名前を使用することは、モジュール性とは正反対です。ClassNotFoundExceptions は OSGi であり、誰かがそのモジュール フェンスを尊重していないことを示しています。つまり、コードを構造化する方法にはモジュール性が必要であり、OSGi はこれらのモジュールを実行するための基盤を提供し、それらの境界を強化するだけです。

そのため、OSGi には、グローバル変数や実装の詳細の漏洩に悩まされない非常に強力なモジュールを作成するための、非常に洗練された、非常に過小評価されているテクノロジー、uServices があります。これらの uService は、仕様パッケージで指定され、軽量ブローカーを介してモジュール間で共有されるオブジェクトです。uServices は実際には Spring XML の必要性を無効にします。

残念ながら、現在の最先端では、Java の開発者の多くは、クラス ローディング ハックがオープン ソース プロジェクトを結び付ける方法であると信じて育ちました。

良いニュースは、物事が動いているということです。現在、多くのプロジェクトが JAR バンドルを作成し始めています (OSGi は maven central での人気が 33 位です) が、ほとんどのポートはヘッダーを提供するだけです (maven central で最もダウンロードされたプラグインの 1 つを使用しています)。ただし、この最初のステップが語られると、通常、サービスの追加はそれほど難しくありません。私は、このプロセスをスピードアップするために OSGi Alliance に雇われています。実際、JPA は私のリストの一番上にあります。

元の質問に戻ります。私が知る限り、複数のクラス スペースに必要な概念であるクラス ローダーをサポートしているのは Java だけです。私が知っているすべての動的言語は、クラス名によってのみバインドされ、要件を効果的に除外します。だから私は、実際には代替案がないことをかなり確信しています...

于 2013-08-24T15:57:36.023 に答える