連載
» 2005年09月02日 12時00分 公開

明日からできるプロジェクト管理(3):ビルド管理を楽にするオープンソースツール一覧 (3/5)

[高野敦,@IT]

自動化

 定期的なビルドをさらに進めると「継続的インテグレーション(ビルド)」につながります。この方法はXPで採用されているプラクティスでも有名ですが、XPに限らずどのような開発手法でも取り入れるべきだと思います。複数の人で開発されている場合には、継続的インテグレーションをすることでインターフェイスの不整合を防ぐことができます。このプラクティスの詳細については、以下のURLを参照してください。




 この継続的インテグレーションを行うためにはビルドをツールによって自動化することが必要でしょう。それらのツールについて説明します。

 まずビルドを自動化するツールを見てみましょう。

 ビルドを自動化するツールには1回のビルドを自動化するツールとビルドするタイミングを計画することで複数回のビルドを自動化するツールがあります。前者は、ビルドするタイミングに人間がビルドツールを使ってビルドします。後者はビルド計画を人間が登録すると、その計画に従ってビルドします。ここでは前者をビルドツール、後者をビルドサーバツールと呼ぶことにします。

ビルドツール

 ビルドツールとしては、Make、Ant、Maven、スクリプトファイル、商用構成管理ツールの機能としてのビルドツールなどが挙げられると思います。それぞれMakeはmakefile、Antはbuild.xml、Mavenはproject.xml、スクリプトファイルはファイルそのものにビルドする手順や情報を定義し実行します。商用構成管理ツールに関してはそれぞれの製品のマニュアルを参考にしてください。

 オープンソースとしてはAntあるいはMavenを利用することが一般的であるため、ここではこの2つのツールを説明します。

Ant

 Apache Antは、Apache Software FoundationによってApache Software Licenseで提供されるオープンソースツールです。

 Antは作業をターゲットという単位で記述します。ターゲットはAntが提供するタスク(コンパイル、パッケージングなど)を順序付けることで定義します。そしてそのターゲットは設定ファイルとして記述します。

 具体的な設定ファイルを見てみましょう。

<?xml version="1.0"?>
<project name="HelloWorld" basedir="." default="all">
    <property name="app.name" value="helloworld"/>
    <property name="build.dir" value="build"/>
    <property name="dist.dir" value="dist"/>
    <property name="src.dir" value="src/java"/>
    <target name="init">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${dist.dir}"/>
    </target>
    <target name="clean">
        <delete dir="${build.dir}"/>
        <mkdir dir="${build.dir}"/>
        <delete dir="${dist.dir}"/>
        <mkdir dir="${dist.dir}"/>
   </target>
   <target name="compile" depends="init">
        <javac srcdir="${src.dir}" destdir="${build.dir}"
        includes="**/*.java" debug="true" deprecation="true"/>
   </target>
   <target name="jar">
        <jar jarfile="${dist.dir}\${app.name}.jar">
           <fileset dir="${build.dir}"/>
        </jar>
   </target>
   <target name="all" depends="init,clean,compile,jar"/>
</project>
build.xmlの例

 このbuild.xmlによってsrc/javaフォルダにあるJavaのソースコードをコンパイルし、その結果をbuildフォルダに格納し、buildフォルダの中にあるファイルをjarファイルとしてパッケージングしてdistフォルダに格納させることができます。

 上記のbuild.xmlに定義したビルドを行うには、

ant

を実行します。antコマンドは、引数としてターゲット名を指定しますが、ここでは省略しこのbuild.xmlが定義しているプロジェクトのデフォルトのターゲットであるallターゲットが実行されています。このallターゲットは何もしませんが、その前提条件であるinit、clean、compile、jarターゲットを実行し実行可能ファイルとしてのjarファイルをビルドしています。

 Antの利用方法の詳細は、@ITのJavaTipsに説明されていますので参照してください。




 このURLの一覧の中でAntに関する記述を参考にしてください。特に、build.xmlファイルを分割してモジュール的に利用したい場合は、以下の記事が参考になります。




 このAntによって、ビルドがantというコマンドを1回実行するだけになったことに着目してください。これがビルドツールの効果です。

Maven

 Antは利用してみると、build.xmlを書くことが意外に手間であることが分かります。プロジェクトで1回作り、保守すればよいので大したことはないのですが、気になる場合もあるでしょう。特に前述した例のように簡単なものならばよいですが、実際のプロジェクトで利用するためにはもっと複雑なものが必要です。そのときは結構手間だと感じると思います。そのような場合はここで紹介するApache Mavenを利用するとよいでしょう。Apache Mavenは、Apache Software FoundationによってApache Software Licenseで提供されるオープンソースツールです。

 MavenでもAntと同様に以下のような設定ファイル(project.xml)を作成します。Antとは違い、作業を定義することはありません。作業は後で説明する「ゴール」によって定義され、ユーザーが定義する必要はありません。Mavenの設定ファイルではフォルダ構成や組織、プロジェクトの情報、構成管理ツールのアクセス方法などを定義することになります。

 具体的な設定ファイルを見てみましょう。

<?xml version="1.0" encoding="UTF-8"?>
<!--
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*             http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-->
<project>
   <!-- the version of maven's project object model -->
   <pomVersion>3</pomVersion>
   <!-- a unique name for this project -->
   <id>app</id>
   <!-- a short but descriptive name for the project -->
   <name>Example Application</name>
   <!-- The version of the project under development, e.g.
            1.1, 1.2, 2.0-SNAPSHOT -->
   <currentVersion>1.0</currentVersion>
   <!-- details about the organization that 'owns' the project -->
   <organization>
      <name>Apache Software Foundation</name>
      <url>http://www.apache.org/</url>
      <logo>http://maven.apache.org/images/jakarta-logo-blue.gif</logo>
   </organization>
   <!-- the year the project started -->
   <inceptionYear>2002</inceptionYear>
   <package>example.app</package>
   <logo>http://maven.apache.org/images/maven.jpg</logo>
   <description>A collection of example projects showing how to use maven in different situations</description>
   <!-- a short description of what the project does -->
   <shortDescription>How to use maven in different situations</shortDescription>
   <!-- the project home page -->
   <url>http://maven.apache.org/reference/plugins/examples/</url>
   <issueTrackingUrl>http://nagoya.apache.org/scarab/servlet/scarab/</issueTrackingUrl>
   <siteAddress>jakarta.apache.org</siteAddress>
   <siteDirectory>/www/maven.apache.org/reference/plugins/examples/</siteDirectory>
   <distributionDirectory>/www/maven.apache.org/builds/</distributionDirectory>
   <!-- the version control repository and http url for online access
the connection element has the form:
scm:<system>:<system specific connection string> -->
   <repository>
      <connection>scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:maven-plugins/examples</connection>
      <url>http://cvs.apache.org/viewcvs/maven-plugins/examples/</url>
   </repository>
   <!-- any mailing lists for the project -->
   <mailingLists/>
   <!-- who the developers are for the project -->
   <developers/>
   <!-- jar files the project is dependent on -->
   <dependencies/>
   <!-- build information for the project -->
   <build>
      <nagEmailAddress>turbine-maven-dev@jakarta.apache.org</nagEmailAddress>
      <sourceDirectory>src/java</sourceDirectory>
      <unitTestSourceDirectory>src/test</unitTestSourceDirectory>
      <unitTest>
         <includes>
            <include>**/*Test.java</include>
      </includes>
      <excludes>
            <exclude>**/NaughtyTest.java</exclude>
      </excludes>
      </unitTest>
      <resources>
        <resource>
          <directory>src/conf</directory>
           <includes>
              <include>*.properties</include>
           </includes>
        </resource>
      </resources>
   </build>
</project>
project.xml


[注] 設定ファイルにおける要素の下の要素の値である http://cvs.apache.org/viewcvs/maven-plugins/examples/は無効なURLです。 Maven1.0.2において自動生成されるファイルをそのまま掲載しているために無効 なURLのままにしています。


 きっと、このファイルを作成するくらいならbuild.xmlを作成するのも変わらないと思われると思います。上記の例での値がApache Software Foundationになっていることに注目してください。これは以下のコマンドによって自動生成されたものです。

maven -Dmaven.genapp.template=default -Dmaven.genapp.template.id=app -Dmaven.genapp.template.name="Example Application" -Dmaven.genapp.template.package=example.app genapp


[注] maven genappと実行して、対話型で生成することも可能です。


 このコマンドを実行することでカレントフォルダに以下のようなプロジェクト構造が生成されます。

ALT 図3 プロジェクト構造

 app.properties、App.java、AbstractTestCase.java、AppTest.java、NaughtyTest.javaはテンプレートに定義されているダミーのソースコード、設定ファイルです。実際のプロジェクトではこれを削除して利用します。

maven jar:jar

と実行することでビルドすることができます。targetフォルダがプロジェクトルートフォルダの下に作成され、app-1.0.jarというファイルがビルドされます。

 このproject.xmlを作成することでコンパイル、jarファイルの作成、warファイルの作成などいろいろな作業を自動化することができます。各作業に対してそれぞれタスクとしてbuild.xmlに記述しなければ自動化できないAntとそこが異なります。

・ゴール

 mavenコマンドの後で指定されているjar:jarを「ゴール」と呼びます。Mavenは複数のゴールを用意しており、project.xml1つで複数の作業を自動化することができます。

 ゴールは「プラグイン名:プラグインのゴール」という形式で記述されます。前に実行したjar:jarはjarプラグインのjarゴールを実行したことになります。ほかにもjava:compileというコンパイルをするためのゴールなど最初から400近いゴールが定義されています。ゴールの一覧を見るには、

maven -g

を実行します。

・ライブラリ管理

 ライブラリ管理の方法のうち、リポジトリによる共有の方法をMavenは実現します。Mavenをインストールするとインストールしたユーザーのホームディレクトリに.mavenというフォルダが作成され、このフォルダ以下がリポジトリとなります。このフォルダにライブラリを命名規則に従って格納し、共有します。

ALT 図4 フォルダ階層
ALT 図5 命名規則

 このような形式で格納されており、project.xmlで

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <id>junit</id>
            <version>3.8.1</version>
        </dependency>
    </dependencies>

と記述することでこのライブラリの定義したバージョンを利用することができます。

 このように、Mavenを利用することでライブラリの管理、ビルドを、mavenコマンドとゴールの組み合わせによって自動化することができます。

テストの自動化

 AntやMavenによってJUnitのようなテストツールを自動実行することもできます。その結果のレポートを出力することもできます。レポートについては次回以降の記事で詳細を説明します。

 このようにビルドと同時に基本的なテストを実施することで障害を含んだモジュールをリリースすることを防ぐことができます。テストの内容も検討して格納場所を定義し、これらのビルドツールで実施することが重要です。

 Antではターゲットとしてテストを行い、Mavenではproject.xmlの要素の 要素で定義したフォルダにJUnitのコードを格納しておき、test:testゴールを実行します。前に記述したjar:jarゴールは、test:testゴールが前提条件になっているためテストが実行されます。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ