32

さまざまなプロジェクトで使用する Java ユーティリティ ライブラリ (Apache Commons と同様) を開発しました。ファット クライアントに加えて、モバイル クライアント (J9 Foundation プロファイルの PDA) にも使用します。単一のプロジェクトとして開始されたライブラリは、やがて複数のパッケージに広がりました。その結果、すべてのプロジェクトで実際には必要とされない多くの機能が必要になります。

このライブラリは一部のモバイル/PDA プロジェクト内でも使用されるため、使用されているクラスだけを収集して実際の特殊な jar を生成する方法が必要です。

現在、このライブラリを使用しているプロジェクトには、(ユーティリティ プロジェクトから) 特殊な jar ファイル (例: my-util-1.0-pda.jar、my-util-1.0-rcp.jar) を生成する Ant jar タスクがあります。 jar タスクの組み込み/除外機能を使用します。これは、モバイル プロジェクト用に生成された jar ファイルのサイズの制約により、主に必要になります。

今Mavenに移行していますが、似たようなものに到達するためのベストプラクティスがあるかどうか疑問に思っています. 次のシナリオを検討します。

[1] - メインの jar アーティファクト ( my-lib-1.0.jar ) に加えて、分類子 (例: my-lib-1.0-pda.jar ) を使用して Maven Jar プラグインを使用して、my-libプロジェクト内で個別の/特殊化されたアーティファクトを生成します。または Maven アセンブリ プラグインのフィルタリング/インクルード。このアプローチは、ライブラリの消費者の要求 (フィルター) でライブラリを汚染するため、あまり快適ではありません。

[2] - 「my-lib」を「ラップ」し、フィルタリングされた jar アーティファクト (例: my-lib-wrapper-pda-1.0 ...など)を生成する、すべての特殊なクライアント/プロジェクト用の追加の Maven プロジェクトを作成します。 . その結果、これらのラッパー プロジェクトには (フィルター処理されたアーティファクトを生成するための) フィルター処理が含まれ、"my-lib" プロジェクトのみに依存し、クライアント プロジェクトはmy-ではなくmy-lib-wrapper-xxx-1.0に依存します。 lib-1.0. このアプローチは問題があるように見えるかもしれません. 「my-util」ライブラリのクラス (「my-pda-app」プロジェクトには「my-lib-wrapper-for-my-pda-app」プロジェクト/依存関係が必要です)。

[3] - ライブラリを使用するすべてのクライアント プロジェクト (例: my-pda-app ) で、特殊な Maven プラグインをいくつか追加して、(最終的なアーティファクト/パッケージを生成するときに) 不要なクラス (例: maven-assembly -plugin、maven-jar-plugin、proguard-maven-plugin)。

「Maven の方法」でこの種の問題を解決するためのベスト プラクティスは何ですか?

4

1 に答える 1

24

Mavenの一般的なルールは、モジュール性のために「POMごとに1つのプライマリアーティファクト」であり、この規則に違反してはならない理由(一般的に)は、1つのプロジェクトから2つのJARを作成する方法(...およびなぜあなたはすべきではないのか)ブログ投稿。ただし、正当な例外があります(たとえば、EJB JARを生成するEJBプロジェクトと、インターフェースのみを持つクライアントEJB JAR)。そうは言っても:

前述のブログ投稿( 「規則を使用できない場合のMavenの使用」も確認してください)では、個別のプロファイルまたはJARプラグインを使用してオプション1を実装する方法について説明しています。このソリューションを実装する場合は、これは例外であり、依存関係の管理が難しくなる可能性があることに注意してください(そして、前述のように、「クライアントフィルタリングロジック」でプロジェクトを汚染します)。念のため、ここではいくつかのJARプラグインの実行を使用します。

オプション2は、オプション1のIMOとそれほど違いはありません(物事を分離することを除いて)。基本的に、他のラッピング/フィルタリングプロジェクトをN個持つことは、1つのプロジェクトにフィルタリングルールをN個持つことと非常に似ています。そして、フィルタリングが理にかなっている場合、私はオプション1を好みます。

不要なものを「取り除く」ことは図書館のクライアントの責任ではないと思うので、私はオプション3がまったく好きではありません。第一に、クライアントプロジェクトは必ずしも必要な知識(何をトリミングするか)を持っているわけではなく、第二に、これは他のプラグインとの大きな混乱を引き起こす可能性があります。

ただし、ファットクライアントがmy-lib全体を使用していない場合(サーバー側のコードがEJB JAR全体を必要とする場合など)、フィルタリングは状況を処理するための適切な「Maven方法」ではありません。正しい方法はオプション4です。プロジェクトに共通するすべてのもの(my-lib-core-1.0.jarを生成する)と特定のプロジェクトに特定の部分を配置する(my-lib-pda-1.0.jarなどを生成する)。クライアントは、コアアーティファクトと特殊なアーティファクトに依存します。

于 2010-03-11T15:35:34.270 に答える