2013-06-17 9 views
12

私は、基盤となる(読み込まれたWeb以外の)Thrift Servicesを呼び出すフロントエンド(読み込み:ウェブに面する)HTTP APIに基づいた分散アプリケーションを構築しています。例としてMavenマルチモジュールプロジェクト構造

、Iが有していてもよい:

  • 認証サービス(認証用コードを含ん)
  • コアサービスは、(生成された倹約源と、サービス発見と初期化ロジックのようないくつかの一般的なクラスが含まれ)

すべての個々のサービスは、HTTPウェブ向けAPIと同様に、コアサービスに依存します。私はこれをマルチモジュールプロジェクトとして今は持っていますが、それぞれを別々のものにしたいと思います(自分のリポジトリで追跡しますが、マルチモジュールビルドでもこれを行うことができます)。

TL; DR -

個々に構築され、次いで、Mavenのリポジトリにプッシュ(そして他にジャーとして含まれているモジュール(コアサービス)を有するように、共通のビルド的ですプロジェクト)、あるいはマルチモジュールプロジェクトを行う方が良いでしょうか?

答えて

14

個人的には、Maven Release Pluginを使用している場合は、すべてのモジュールを一緒にリリースするようにロックされています。

これは利便性のように聞こえるかもしれませんが、バグ修正のリリースをモジュールの1つに行う必要がある場合、問題が発生します。バグフィックスのモジュールだけでなく、彼らは変わっていない。

また、マルチモジュールプロジェクトでCIを実行している場合にヒットします。ビルドは通常、rootのすべてのモジュールで実行されますが、特定のモジュールで作業している場合は、変更されていないモジュールをビルドしたことで、モジュール化がもたらすメリットの一部が失われました。

したがって、独立したモジュールを使いますが、これは重要なビットです。それぞれが使用する共通の「依存関係」を作成します。

A「依存」ポンポンは、プロジェクト全体のすべての依存関係を標準化しているものの依存関係がdependencyManagementセクションではなくdependenciesセクションで指定されているが異なるポンポンである(それはまた、標準のプラグインの設定などを設定します)。これにより、プロジェクトpomsは親としての依存関係pomを指定し、必要な依存関係を '依存関係'ポームから選択してプロジェクト全体で標準化したバージョンを差し引いて宣言することができます。

これまでにすべてを構築できることに懸念がある場合、これは簡単なバッチファイルで実現できます。

+0

Mavenリリースプラグインに関する私の問題を思い出させていただきありがとうございます:-) –

+3

マルチモジュールプロジェクトの使い方についてのちょっとしたコメント - モジュールのライフサイクルが異なる場合は、同じものに含めるべきではありませんマルチモジュール構造。 @ colin-morelliは彼の決定においてこれを考慮する必要があります。 – whaley

+0

@whaley現時点では、それらはすべて同じライフサイクルを持ちます(これは、現在、すべてがマルチモジュールプロジェクトに入っているためです)。しかし、プロジェクトはすでに十分に大きく、ビルド、テスト、デプロイには少し時間がかかります。理想的には、独立してリリースできるところまで進んでいくことが好きです。 –

7

私はマルチモジュールプロジェクトが優れていると言います。リポジトリにコアサービスを配置する場合、開発者はバージョンを気にする必要があります。 Developer1は古いサービスが必要ですが、Developer2はサービスを更新します。

複数のブランチも問題になる可能性があります。

+0

スリフトは、ほとんどの変更をきれいに処理します(たとえば、メソッドシグネチャの最初のパラメータを別のタイプに変更しない限り)。したがって、サービスA(サービスBのバージョン1でコンパイルされたサービスA)がサービスBのバージョン2を呼び出すことができ、何の問題もない可能性は全くあります。これは倹約と一緒に行く理由の一部であり、アプリケーションは疎結合することができます。しかし、あなたは有効なポイントを作るので+1私から+1 –

3

原則として、プロジェクトを可能な限り独立して進化させる方が良いです。しかし、これは技術的な問題ではなく組織的な問題です。すべてが言われて、あなたのプロジェクト構造はあなたの組織と一貫していなければなりません。

これは、プロジェクトを別々のものに保ち、異なるリポジトリマネージャが依存関係を管理しているプロジェクトや依存関係を別の人が管理している場合、それ以外の場合は、マルチモジュールのプロジェクト構造を使うほうが良いでしょう。

私たちのプロジェクトでは、マルチモジュール構造を採用していますが、すべてのプロジェクトは独立したSubversionリポジトリに存在し、別々に分岐することができます。特定の顧客向けにカスタマイズされたリリースを作成するために、svn:externalsを使用して、異なるブランチからのプロジェクトをどのように組み合わせてマッチさせるかを選択するアグリゲータープロジェクト。

類似の構造を維持することは複雑で時間がかかるという欠点があります。我々は、これらのタスクを部分的に自動化するために相当量のスクリプトを開発しました。 Maven release pluginはSubversion外部でフックされたモジュールを扱うことができないので、これは特に面倒です。

+1

これは私の気持ちでもあります(プロジェクトを独立して進化させる方が良い)。実際、マルチモジュールプロジェクトを始めるには何かが間違っていました。残念なことに、時間的な制約は、それをオプションではないものにしましたが、私は今これを再訪する時間があります。彼らは間違いなく別のチームによって維持されます。 –

+0

上記のアプローチは、間違いなく複雑ですが、アグリゲータープロジェクトをそれだけであるとみなしていることに注意してください。プロジェクトを一緒に構築する方法です(望むならば)。これにより、目的が異なるモジュールサブセットごとに異なるアグリゲータを持つことができます。リリースを実行するためにすべてをまとめたもの、単一のWARファイルにパッケージ化されたプロジェクト用のものなどがあります。 –

5

個々のモジュールのすべてが互いに同じライフサイクルを持つ場合、マルチモジュールビルドが優先されるべきです。言い換えれば、常に一緒にリリースされ、バージョン番号が一緒に増加するなどです。

OSS世界では、これの強力な例がapache camel projectです。たとえば、すべてのバンドルされたコンポーネントはindividual modulesとして存在し、プロジェクトに別々に組み込むことができますが、ラクダコア配布と同じライフサイクルに縛られています。

Mavenのマルチモジュールビルドでは、プロジェクトをCIに入れたり、IDEなどで読み込んだりするのに便利ですが、一般的に言えば、個々のモジュールがすべて同じライフサイクルを共有していない場合、マルチモジュールプロジェクトはあまり適していません

+0

私は、別々のモジュールを使うことにしました。みんなからアドバイスをいただければ幸いです。ニックへの答えを与えてくれたが、あなたにも+1する - あなたはどちらも私をその方向に押し込んだ。 –

関連する問題