DATE : 2006/12/06 (Wed)
引数に渡された値が null であれば例外を投げるという場面は数多くあると思います。
例えば、引数に null を許可しない setName(String) メソッドを考えると、次のようなコードになります。このメソッドは、引数に渡された文字列を name フィールドに設定するという処理を行います。
/** * <p>名前を設定します。</p> * * @param name 設定する名前 * @throws IllegalArgumentException name が null の場合 */ public void setName(String name) { if (name == null) { throw new IllegalArgumentException("引数が null です。"); } this.name = name; }
Jakarta Commons Lang 2.0 以降の org.apache.commons.lang.Validate クラスにある notNull メソッドを使用すると、null チェックの部分を簡略化することができます。
例えば、Validate#notNull(Object, String) は、第1引数が null であれば第2引数のメッセージを設定した IllegalArgumentException を投げます。
notNull メソッドを使うと、上の例は次のようになります。(import 文などは省略しています)
public void setName(String name) { Validate.notNull(name, "引数が null です。"); this.name = name; }
メッセージが「The validated object is null」という英文でも構わない場合は、第2引数のないValidate#notNull(Object) が使えます。
public void setName(String name) { Validate.notNull(name); this.name = name; }
notNull メソッドの行っている処理は非常に簡単なものですが、引数チェックを書く手間がかなり省けます。また、うっかりして null の判定を間違える心配もなくなります。
この他にも、Validate クラスには引数チェックを行う場合に便利なメソッドが揃っています。
(*´∀`)引数チェックは定型的な処理が多いので、このようなクラスは非常に便利ですね。
DATE : 2006/12/03 (Sun)
「Aggregating Maven Javadoc Plugin - Javadocs for Multi-Projects」から、全モジュールをまとめた Javadoc を生成する設定をメモしておきます。
通常、複数のモジュールで構成されているプロジェクトで javadoc:javadoc ゴールを実行すると、モジュールごとに別々の Javadoc が生成されます。しかし、プロジェクトで最上位の pom.xml に設定を行うと、プロジェクト全体のドキュメントを生成できます。
具体的には、maven-javadoc-plugin の設定で aggregate 要素を true に設定します。(以下の例で「...」は省略を表します)
... <reporting> <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <configuration> ... <aggregate>true</aggregate> ... </configuration> </plugin> ... </plugins> </reporting> ...
maven-javadoc-plugin を設定している部分が build 要素内ではなく reporting 要素内である部分に注意してください。reporting 要素とは、プロジェクトに関するレポート(ウェブページや Javadoc、テスト結果など)の設定を行う部分です。
aggregate 要素を false にすると、通常通り、モジュールごとの Javadoc が生成されます。
参考文献
DATE : 2006/12/01 (Fri)
Maven の各フェーズには、ゴールが設定されています。
例えば、compile フェーズには compiler:compile ゴールが、package フェーズには jar:jar ゴールが標準で設定されています。
ここで以下のように pom.xml の設定を行うと、phase 要素のフェーズに goal 要素に示したゴールが実行されます。
... <build> <plugins> ... <plugin> <groupId>プラグインのgroupId</groupId> <artifactId>プラグインのartifactId</artifactId> <executions> <execution> <id>実行する処理を区別するためのID</id> <phase>処理を実行するフェーズ名</id> <goals> <goal>実行するゴール</goal> <goal>(複数記述可)</goal> </goals> <configuration>この処理でのプラグインの設定</configuration> </execution> <execution>(複数記述可)</execution> </executions> </plugin> ... </plugins> </build> ...
特別な設定が必要ない場合、configuration 要素は省略できます。
テストコードを収めた JAR ファイルを作成する jar:test-jar ゴールを test フェーズに実行するには、次のように記述します。
... <build> <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <id>create-test-jar</id> <phase>test</phase> <goals> <goal>test-jar</goal> </goals> </execution> </executions> </plugin> ... </plugins> </build> ...
goal 要素に指定しているのは「jar:test-jar」の「:」以降の部分であることに注意してください。「maven-xxx-plugin」の xxx 部分は、標準では「:」以前の部分と自動的に解釈されます。そのため、goal 要素には「:」以前の部分は書きません。
標準では、test フェーズには surefire:test ゴールが設定されています。そのため surefire:test ゴールの後に jar:test-jar ゴールが実行されます。
なお、phase 要素も省略することができます。phase 要素を省略すると、実行はそのゴールに関連付けられたフェーズで行われます。例えば、jar:test-jarのページには、次のような記述があります。
Automatically executes within the lifecycle phase: package
つまり phase 要素を省略すると、jar:test-jar ゴールは package フェーズで実行されることになります。
関連記事
参考文献
DATE : 2006/11/28 (Tue)
Eclipse などの IDE では依存するライブラリやプロジェクトのソースコードを参照することで、そのクラスやメソッドに関するドキュメントを表示しています。
IDE で Maven を使って複数のモジュールからなるプロジェクトを開発していると、モジュール同士は Maven のローカルリポジトリを経由して参照しあうことになります。
しかしモジュールをローカルリポジトリにインストール(install フェーズを実行)すると、クラスファイルの JAR はインストールされますが、ソースコードはインストールされません。そのため、依存するモジュールのドキュメントが IDE 上で表示されないという現象が発生します。
そこでモジュールの pom.xml に設定を行い、install フェーズ実行時にソースコードもインストールされるようにします。(「...」は省略を表します)
... <build> <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> ... </plugins> </build> ...
maven-source-plugin は、IDE 用などにソースコードを JAR 形式にまとめるプラグインです。このプラグインの source:jar ゴールを実行すると、テストコードを除いた全ソースコードが JAR 形式に圧縮されます。
そのため source:jar ゴールを実行するように設定すると、 install フェーズの実行中にゴールが実行されます。
<execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution>
ちなみに source:jar ゴールは標準では package フェーズに関連付けられています。install フェーズを実行すると、その直前に package フェーズの処理も行われるので、ソースコードのインストールも行われるというわけです。
なお、上の例はモジュールひとつに限定した話です。プロジェクトの全モジュールでソースコードをインストールする場合は、プロジェクト最上位の pom.xml に次の設定を行います。
... <build> <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <inherited>true</inherited> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> ... </plugins> </build> ...
inherited 要素を有効にしました。この要素を有効にすることで、子モジュールにここで設定した maven-source-plugin の設定が受け継がれます。
なお、最上位の pom.xml の設定は、その pom.xml 自身がローカルリポジトリにインストールされなければ有効になりません。そのため、上の設定を終えた後は install フェーズを実行して pom.xml をインストールします。
参考文献
DATE : 2006/11/22 (Wed)
その後もこのエラーが発生する原因を調べていたのですが、どうやら maven-jetty-plugin で起動される Jetty ウェブサーバのバグのようです。 JETTY-170 にその報告があります。
現状ではまだバグが直っていないようなので、前掲の記事の対処法に頼るしかなさそうです。
なお、最近になって maven-jetty-jspc-plugin という JSP コンパイラプラグインも出てきました。こちらも、現状では JSF の TLD ファイルが見つかりません。この問題も前掲の対処方法を使うと解決できます。
(;^ω^)pom.xml がかなり汚くなりますが、バグが直るまでの辛抱ですね