2011/04/30

MVN Tips : 標準ディレクトリ構造

Mavenでは標準となるディレクトリ構造が決まっています。
もちろん標準以外の構成を使用することもできますが、標準構成ならPOMの記述もシンプルになるので、可能な限りこの構成に合わせてください。

  • pom.xml
  • src
    • main
      • java
      • resources
      • webapp
    • test
      • java
      • resources
  • target  (svn:ignore)

これに加えて、下記のような開発者用リソースを決めておくと便利です。

  • local-env
    • resources (svn:ignore)
    • default

開発者が手元で変更した設定が誤ってコミットされないように、設定例をdefaultに入れておき、各開発者はそれをresourcesにコピーして使用するようにしています。

ソース

Maven関連まとめ

2011/04/26

MVN Tips : 安定したビルドと柔軟なビルド

あるMavenプロジェクトを何回ビルドしても同じ結果が得られることを、ビルドが安定していると呼びます。逆に、ビルドした時点で新しい成果物を取り込むビルドを柔軟なビルドと呼びます。

ビルドの安定性を決めるのが、バージョンの指定方法です。
  1. 特定バージョンを指定
    • 1.0
      • 同じバージョンが更新されることはないため、ビルドは安定します。
  2. バージョンのレンジ指定
    • [1.0,)
      • 1.0以上
      • 特定バージョン以降のすべてのバージョンアップを取り込みます。
    • [1.0,2.0)
      • 1.0以上、2.0未満
      • 特定バージョン以降のマイナーバージョンアップを取り込みます。
  3. SNAPSHOTバージョンを指定
    • 1.0-SNAPSHOT
      • SNAPSHOTバージョンは同一バージョンのまま更新されます。
ビルドの安定性と柔軟性はトレードオフの関係にあるため、臨機応変に使い分けてください。

2011/04/21

MVN Tips : 親POMでprofileをactivateしても、継承されない

Profileには継承という概念はなく、各階層ごとに処理されます。
activationを使ってProfileを自動アクティベートする場合には注意してください。

Maven関連まとめ

MVN Tips : POMの親子関係

POMには親子関係を設定できますが、親から子の関係と、子から親の関係は目的が違います。

子から親を参照(Inheritance)
Parent POMを指定すると、他のPOMの情報を引き継ぐことができます。指定にはGroup等の成果物の情報が必要です。
依存ライブラリのバージョン管理、プラグインのバージョン管理、デプロイ設定など、mavenを使う上では必須のテクニックです。Parent POMは一つしか指定できませんが、複数階層設定することができます。

親の指定には追加で相対パスも指定できるのですが、これがちょっと曲者でデフォルトで../pom.xmlが指定されています。リポジトリ経由で親POMを指定する場合には、明示的に<relativePath/>としておいた方が良いです。

ソース

親から子を呼び出し(Aggregation)
POMの中でモジュールとして別のPOMを指定することで、ビルド時に連携してビルドさせることができます。指定には相対パスを利用します。Parent POMの親子関係とは関係なく設定できるので、複数のプロジェクトをまとめてビルドする際に便利です。



Maven関連まとめ

2011/04/20

AWS Tips : Reserved Instanceの適用範囲

AWSの使用料金をさらに安くするために重要なのが、Reserved Instanceです。
おさえておきたいポイントを何点か列挙します。
  • Reserved Instanceは一時金+従量課金で、使わなくても良い(ソース)
  • EC2のReserved InstanceはAvailability Zone単位(ソース)
  • RDSのReserved DB InstanceはRegion単位(ソース)
  • Consolidated Billingを使うと、アカウント間でReserved Instanceを共有できる(ソース)

AWS関連まとめ

MVN Tips : デプロイ先をReleaseとSnapshotで切り替える

Nexusを使用している場合、固定バージョンの成果物はReleaseリポジトリ、-SNAPSHOTバージョンの成果物はSnapshotリポジトリにデプロイする必要があります。

この場合には、distributionManagementにrepository、snapshotRepositoryの両方を指定しておけば、バージョン情報に応じて適切なリポジトリにデプロイされます。(ソース)

Maven関連まとめ

MVN Tips : MavenとNexusとJenkinsとSubversionの素敵な関係

Mavenをビルドツールとして使用する場合には、NexusとJenkinsを組み合わせることをお勧めします。僕はこの組み合わせに到達するまでMavenの便利さを過小評価していました。例えるなら、Javaを普通のエディタで書くのと、Java + eclipseぐらいに違います。

Nexus Repository Manager
Mavenのためのリポジトリマネージャ。社内成果物の管理だけでなく、社外リポジトリへのプロキシとして動作するためMavenビルドが非常に快適になります。

Jenkins
継続的インテグレーション(Continuous Integration)のためのツール。バージョン管理システムからの通知に応じてビルドを実行し、成果物をNexusに登録します。Maven専用のジョブタイプを利用すると、Mavenの依存関係に基づいて自動的に派生ビルドを実行してくれます。

Subversion(もしくは、他のバージョン管理システム)
Nexusに登録するのは各エンジニアではなく、かならずバージョン管理システムに登録されたコードを自動ビルドしたものにします。これにより、個人の環境に依存しない安定したビルド環境を実現できます。

最初のセットアップはちょっと面倒ですが、後が非常に楽になる素敵な組み合わせです。

Maven関連まとめ

MVN Tips : Mavenに入ればMavenに従え

Mavenでは、ソースの階層構造等の推奨構成が決まっており、その構成であれば設定を省略できるようになっています。また、構成だけでなく、「1つのプロジェクトからは原則として1つのプロダクトを生成する」等のMavenの哲学とでも呼ぶものが存在します。
この哲学は多くのエンジニアがたどり着いたベストプラクティスに基づいているため、できる限り従うことで後で楽をできます。

標準構成に基づくことで記述が簡単になるだけでなく、自分以外のエンジニアへの引き継ぎも非常に楽になります。もちろん、環境構築にはそれなりに苦労しますが、人のプロジェクトをビルドするために苦労する日々から解放されますよ。

僕の勤めるリプレックス社内のJavaプロジェクとはMaven標準に基づいているため、プロジェクトのビルド手順は下記のようになります。
1. 開発ツールインストール(eclipse,maven,subversion、1回だけ)
2. 社内Mavenレポジトリを登録(1回だけ)
3. プロジェクトをチェックアウト
4. ビルド
すべての依存関係はmavenによって解決され、必要なjarファイルが自動的にダウンロードされます。また、ソース、JavaDocも自動的にダウンロードされるため、ソースを見ながらのデバグも可能です。

TIpsと呼ぶには大げさかもしれませんが、Mavenを自分に合わせるのではなく、Mavenに自分を合わせましょう。

Maven関連まとめ

2011/04/19

AWS Tips : Elastic IPを使う場合でもCNAMEが便利

Amazon EC2では、Elastic IPという固定IPアドレスを使用することができます。
ただ、このElastic IPは外部公開用のIPアドレスであり、EC2内の通信には望ましくありません。もちろん使えない訳ではないですが、セキュリティーグループの設計等に頭を悩ませることになってしまいます。

そこで便利なのが外部DNS名です。
EC2の外部DNS名はIPアドレスに対して割り当てられるため、Elastic IPにも対応したDNS名があります。このDNS名をEC2内のDNSに問い合わせると内部のIPアドレスを取得することができます。もちろん、EC2外部からDNSに問い合わせればElastic IPを取得できます。

DNS登録する場合もElastic IPを直接登録するのではなく、このDNS名をCNAMEとして登録するのがおすすめです。

AWS関連まとめ

2011/04/18

まずは試作環境の構築から

まずは自由に使用できる試作環境を構築しましょう。

ただ単に自分が管理しているだけでなく、簡単にリセットできることが重要です。
この「リセットできる」という要求から、もし余っているパソコンをお持ちでも、仮想マシンを使用するクラウドサービスの契約をすることをお勧めします。

僕のおすすめはAmazon Elastic Computer Cloud(EC2)。他にもいろいろありますが、EC2は完全従量課金なので契約しておいて損はありません。2011年3月から東京データセンタでのサービスも始まりましたし、日本語での情報も豊富になってきました。

僕の勤めるリプレックスでは2008年からEC2を使用しており、「ウェブポ」は当初からEC2上に構築されています。