2012-07-01 9 views
6

私はすでにこのトピックに関するいくつかの質問があることを知っていますが、私はまだ実際の解決策を見つけることができませんでした。OSGiとEE6を使用してエンタープライズアプリケーションをモジュール化する方法は?

現在、JPA、CDI、JSFを使用してEE6でアプリケーションを開発しています。私は、すべてをWARまたはEARにパッケージングし、すべてをアプリケーション・サーバーにデプロイするよりもモジュラー・アプローチを採用したいと考えています。

私は3つのMavenプロジェクトにモジュールを分離することにより、可能なモジュラーとしての私のアプリケーションを設計しようとしています:

  • APIを - (ステートレス)サービスのためのインタフェース
  • モデルが含まれています - のためのJPAエンティティが含まれています特定のモジュール
  • のImplは - APIの実装、すべてのモジュールのビューロジックが現在、大きな内bundeledさ

ほとんどCDI豆が含まれていますウェブプロジェクト、これは醜いです。私はすでにウェブのフレグメントについて考えていましたが、Beanクラスとxhtmlファイルをjarファイルに分散すると、リソースが親Webアプリケーションによって参照できるようにフックを実装する必要があります。この種のソリューションは、少なくとも、モジュールに関連するすべてのビューロジックを含むモジュールごとに4番目のプロジェクトを持つことを可能にします。これは良いスタートです。

私が望むのは、これらの4種類のプロジェクトだけでなく、すべてのプロジェクトがホットスワップ可能であることだけです。これは私をOSGiに導きました.OSGiは、OSGiコンテナ内でEE6技術があまりサポートされていないことがわかるまで、最初は本当に涼しかったです。

JPA

のは、最初のJPAを見てみましょう。その周りにはJPA対応のOSGiバンドルを作る方法を説明しているチュートリアルがありますが、これらのチュートリアルではエンティティを異なるバンドル(モジュールのモデルプロジェクト)に広げる方法はありません。例えばブログモジュールの三つの異なるモジュール

  • コア
  • ユーザー
  • ブログ

モデル事業は、モデル事業に(コンパイル時に)依存性を持っている私が持っていたいですユーザーの ユーザモジュールのモデルプロジェクトは、コアのモデルプロジェクトに(コンパイル時に)依存します。

このようなシナリオでJPAを動作させるには、モジュールの各モデルプロジェクトに対して永続ユニットを作成する必要はありませんか?実行時に利用できるすべてのエンティティを認識している1つの永続性ユニットが必要です。エンティティがホットスワップ可能なモデルプロジェクト。おそらく、プロジェクトのすべての必要なエンティティをインポートし、すべての必要な設定が含まれているpersistence.xmlを含むすべてのクライアント用に個別のプロジェクトを作成する必要があります。そのようなプロジェクトを構築するための利用可能なMavenプラグイン、あるいはその問題を解決するための他のアプローチがありますか?

CDI

CDIは非常にいいです。私は本当にそれを愛し、私はもうそれを見逃したくありません! MyFaces CODIやDeltaSpikeのようなCDI拡張機能を使用しています。 私は自分の(ステートレスな)サービスを他のサービスやビューレイヤーに注入します。私のサービスはステートレスなので、OSGiサービスとして使用するのは問題ではありませんが、OSGiでのCDIの統合はどうでしょうか?私はCDI BeanにOSGi Servicesを注入するGlassfish CDI Extension [2]を見つけましたが、OSGi ServicesをCDI Beanにしたいと思っています。私はそれを実現する方法は完全にはわかりません。おそらく、BeanManagerを使用して実装をインスタンス化し、BundleActivator内のServiceRegistryのインタフェースのすべての実装を登録する必要があります。それを行うための標準的な方法はありますか?私は、OSGiフレームワークへの(コンパイル時の)依存性を避けたいと思います。

何かを変更することなく、私が今すぐ使用しているのと同じように私のサービスを使用したいと思います(実装は注釈付きではなく、注入ポイントは修飾されていません)。 JBoss Weldエクステンション/サブプロジェクト[3]が問題をターゲットにしているようですが、非アクティブであるようですが、ベストプラクティスやハウツーを見つけることができません。 私は実装をそのままにしておくことができますが、OSGiはまだ使用できますか?いずれの実装でもステレオタイプ注釈が注釈付けされているので、実装に注釈を追加するのは大したことではないでしょう。とにかくそれを防止したいと思います。

JSF

私は賢い私の見解・ロジック・モジュールを広げることができるようにしたいと思います前に述べたように。私が知っている限り、これは箱から実際には可能ではありません。 Pax Web [4]は何とかそれを解決するはずですが、私はそれに精通していません。

私はFaceletテンプレートを含むモジュール "core"に "coreWeb"というプロジェクトを持っています。それを "template.xhtml"としましょう。モジュール "blog"の "BlogWeb"というプロジェクトのJSFページは、そのテンプレートを参照してコンポジションを適用できる必要があります。

ビューを拡張できるようにするために、モジュールの特定のクラスで実装できるJavaインターフェイス「拡張機能」を紹介します。ビュー用のコントローラは、拡張機能のすべての実装を注入します。拡張は、例えば、メインビューに含まれるサブビューのリストを提供する。

説明した拡張メカニズムを簡単に実装することができますが、次の要件が満たされている必要があります

  • アプリケーションサーバに新規のOSGiバンドルを追加する場合は、利用できる拡張機能のセットが変更される可能性がある、拡張子が利用可能でなければなりませんビューのコントローラのために。
  • メインビューに含めるべきサブビュー(別のバンドルから)はアクセス可能でなければなりません。

Spring Slices [5]の単一のホストで複数のスライスアプリケーションの概念は非常に興味深いですが、Spring DM Serverに限られているように見えますが、プロジェクトも非アクティブに見えます。私はあなたが私がachiveしたいものを知っていることを願って記載されているすべての例や行動の後

概要

。非常にダイナミックでモジュール化されたEE6 Appです。

私が最後に探しているのは、すべての動作をどのように稼働させるかについてのドキュメントです。

[1] http://jaxenter.com/tutorial-using-jpa-in-an-osgi-environment-36661.html

[2] https://blogs.oracle.com/sivakumart/entry/typesafe_injection_of_dynamic_osgi

[3] http://www.slideshare.net/TrevorReznik/weldosgi-injecting-easiness-in-osgi

[4] http://team.ops4j.org/wiki//display/paxweb/Pax+Web

[5] https://jira.springsource.org/browse/SLICE

答えて

1

ご質問のいくつかに答えるために単一の永続性ユニットを使用しますが、エンティティを複数に分散させるpleバンドルis not recommended, but may occasionally work。ただし、エンティティが非常に密接に関連しており、永続性ユニットを共有する必要がある場合は、それらのモジュールを複数のモジュールに分割することは意味がありません。また、各エンティティの実装とインタフェースを分離してコンパイル時の依存関係を処理できることも忘れないでください。インタフェースと実装は同じバンドルに存在する必要はありません。

依存性注入については、青写真が好きかもしれません。 いくつかの実装が利用可能であり、エンタープライズOSGiサポートを備えたほとんどのアプリケーションサーバは、出荷時にBlueprintをサポートしています。 XMLを使用してメタデータを追加するので、クラス自体は変更する必要はありません。

+0

コアモジュールには利用可能なエンティティへの汎用アクセスも含まれているので、私はちょうど1つのPUを持っていなければなりませんが、1つのjarファイルにパッケージ化する必要がないといいでしょう。おそらく、パッケージ化を行ういくつかのMavenプラグインがありますが、IMOはそれほどOSGiのようなものではありません。私はすでに青写真のいくつかの例を調べましたが、私はxml構成の非typesafetyが嫌いです。他のオプションがない場合は、おそらくそれを使用するか、CDIソリューションを自分で実装する必要があります。 –

+0

キリスト教徒は、あなたのモジュラーアプリケーションのためにすべての支所の解決策を見つけましたか?あなたは私と共有することができますか?私は同じ問題がありますか? – Suraj

+0

私はそれに直接的な解決策を見つけることができませんでした。私はJava 9(Jigsaw)とそのモジュールを利用するEEリリースを待っています。 JPAプロジェクトの現在のソリューション:サブモジュールのorm.xmlファイルを含む1つの永続プロジェクトを使用します。現在のCDIプロジェクトのソリューション:依存関係を追加するときは、プロジェクトを分離したままにして、注意してください。 Webプロジェクトのための現在のソリューション:可能であれば、サブプロジェクトに分割し、ビルドのすべてを結合します。新しいモジュールを追加したり、すべてのモジュールをアプリケーションに入れたいが、サブセットのみを表示したい場合は、再デプロイしてください。 –

関連する問題