Mavenの依存関係管理について説明します。このドキュメントは、プロジェクト内の依存関係問題を解決し、効率的な開発プロセスを実現することを目指しています。
このドキュメントを読む際には、何か不明な点や改善すべき点があれば、遠慮なく連絡してください。
依存関係管理の目標
- 規範の更新後もコードの変更が必要ない
- オープンソースのJARパッケージのバージョンを標準化する
- 伝播依存関係をチェックする
- 同じクラス名を持つ異なるJARパッケージが存在しないことを確認する
- 既知の問題のあるJARパッケージが使用されていないことを確認する
- 一般的なプラグインを定義する
- yjf-common-utilの依存関係を最適化し、各プロジェクトで必要なものだけを使用するようにする
目標達成方法
1. 共通親POMの作成
- すべてのプロジェクトで共通に使用する親POM `com.yiji.yiji-parent` を定義する
- このPOMはSNAPSHOT版とする
- `dependencyManagement`セクションで一般的なJARパッケージのバージョンを定義する
- このPOMは`yjf-common-util`、`guava`、`log`を依存関係として表示する
- `maven-enforcer-plugin`を使用して、依存関係と伝播依存関係のバージョンが一致するか、または依存関係の方が新しいことを確認する
- `maven-enforcer-plugin`を使用して、既知の問題のあるパッケージが依存関係に入らないことを確認する
- `com.yiji.maven.yiji-maven-plugin`を使用して、同じクラス名を持つJARパッケージが存在しないことを確認する
- 一般的なMavenプラグイン(`maven-compiler-plugin`、`maven-source-plugin`、`maven-eclipse-plugin`、`findbugs-maven-plugin`、`maven-pmd-plugin`)を含めて便利にする
- オープンソースの依存関係については、定期的に更新やバグ修正をチェックする
2. `com.yiji.maven.yiji-maven-plugin`の開発
このプラグインはすでに開発が完了しており、クラスロード順序に関する潜在的な問題を検出できます。現在、このプラグインは異なるJARパッケージに同じクラス名がないことをチェックしています。必要に応じてリソースファイルのチェックや内容のチェックも追加できます。
3. `settings.xml`のカスタマイズ
- `snapshot`依存関係が常に最新であることを確認するために`settings.xml`を定義する
- 他の多くの設定はユーザーが気にしなくてよい
実装方法
CSプロジェクトの改造が完了し、POMファイルが軽量化されました。ただし、伝播依存関係があるため、広範囲に適用する前に依存関係が少ないプロジェクトから試すことが推奨されます。
実施手順
1. `setting.xml`の置き換え
`svn://192.168.45.206/common/yiji-parent/settings.xml`からダウンロードし、Mavenインストールディレクトリ内の`setting.xml`を置き換える。
2. プロジェクトの親POMの設定
CSプロジェクトの親POMに以下を追加する。
<parent>
<groupId>com.yiji</groupId>
<artifactId>yiji-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
POMの`dependencyManagement`セクションからオープンソースのJAR依存関係を削除する(ただし、会社内部の依存関係は削除しない)。IDEが重複定義を警告している場合は、そのバージョン番号を削除する。警告がない場合は、`com.yiji.yiji-parent`にその依存関係が含まれていない可能性がありますので、連絡してください。
3. パッケージングテスト
`mvnp`コマンドを実行し、伝播依存関係の問題がないことを確認します。問題がある場合は、連絡してください。問題がない場合は、`dependency-check.log`ファイルに警告がないことを確認します。
4. プロジェクトのテスト
ユニットテストケースを実行し、問題がないことを確認します。必要に応じて、全量リグレッションテストを行ってください。
よくある質問
1. なぜ簡単にデプロイ可能なものを提供していないのですか?
理由:
- デプロイ先が間違えやすい
- `settings.xml`では`distributionManagement`を定義できない
- 多くのプロジェクトはファサードのみをNexusに公開するため、`com.yiji.yiji-parent`に追加するのは危険
2. 使用可能な一般的なMavenコマンドはありますか?
非Windowsユーザーの場合、`~/.bash_profile`に以下を追加します。
alias mvni='mvn -T 1C clean install -Dmaven.test.skip=true'
alias mvnp='mvn -T 1C clean package -Dmaven.test.skip=true'
alias mvnv='mvn versions:set -DgenerateBackupPoms=false'
alias mvnd='mvn -T 1C clean deploy -Dmaven.test.skip=true'
alias mvndd='mvn -T 1C clean deploy -P dev -Dmaven.test.skip=true'
alias mvndo='mvn -T 1C clean deploy -P online -Dmaven.test.skip=true'
alias mvnc='mvn -T 1C clean eclipse:clean idea:clean'
alias mvne='mvn -T 1C clean eclipse:clean eclipse:eclipse -DdownloadSources=true'
Windowsユーザーは`svn://192.168.45.206/common/yiji-parent/script`のスクリプトをPATHに追加してください。
3. 自動ドキュメント生成プラグインを追加していないのはなぜですか?
`yjf-common-util`では`maven-javadoc-plugin`を使用してドキュメントを生成しますが、時間がかかり、多くの警告が出るためです。
4. IDEにMavenプラグインをインストールする利点は何ですか?
利点:
- POMのエラーをチェックできる
- 依存関係ツリーを見やすくする
5. Mavenについて知らない場合どうすればよいですか?
Mavenについて学ぶことができます。
6. Maven以外にも依存関係の問題がありますが、どのように解決すればよいですか?
具体的な状況を分析し、対策を考えます。
7. 特定のJARのバージョンを使いたい場合どうすればよいですか?プロジェクト内でバージョンを指定しますが、推奨されません。
8. Spring 4.0がリリースされていますが、アップグレードすべきですか?
Spring 3.2へのアップグレードは検討できますが、Spring 4.0はまだ早ければ早いほどアップグレードすることをお勧めします。
9. 公共親POMでバージョンをアップグレードする際のリスク管理はどのように行いますか?
リリースノートを確認し、影響範囲を評価します。
10. `setting.xml`の設定をPOMに移動しないのはなぜですか?
環境固有の設定が必要なためです。
11. よくある問題
11.1 `java.lang.NoClassDefFoundError: org/springframework/ui/velocity/VelocityEngineFactory`
`spring-context-support`を依存関係に追加します。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
11.2 Velocity関連のエラー
IDを変更します。
11.3 `net.sf.ehcache.util.UpdateChecker - Update check failed:`
ehcacheの起動時のバージョンチェックを無効にします。
11.4 `BeanCopier`関連のエラー
`cglib-nodep`の依存関係を削除し、以下の依存関係を追加します。
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-util</artifactId>
</dependency>
11.5 `Spring MVC controller` でのAJAXリクエストエラー `406 Not Acceptable`
コンテンツネゴシエーションの設定を変更します。
11.6 `com.yjf.common.web.CrossScriptingFilter` でのESAPI関連のエラー
必要な依存関係を追加します。
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</dependency>