Teedaにおけるpom.xmlの設定

Teedaでプロジェクトを利用していると、通常Maven2でパッケージを作ると思いますが、その設定例を書き出してみます。基本的にはEclipse上でDoltengを利用して作成したものに手をいれています。あとちょっと昔のプロジェクトなのでバージョンとかは少し古いものです。

注意事項としては、小規模から中規模案件向けの設定になります。

build

ビルドに関してはpathなどはデフォルト設定のまま使っています。ここは妙に変えると面倒ですからね。会社規定のpath構造などをあって、デフォルトと違う場所に移動するとパッケージを作る際に特別な手順などが必要なのと、導入教育が面倒なのでデフォルトで使うのが良いと思います。(共通Path設定にするためのMavenだよね?)

コンパイラバージョンの指定
<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.5</source>
      <target>1.5</target>
      <encoding>UTF-8</encoding>
    </configuration>
</plugin>

通常1.6の新機能って使うことないと思いますので、1.5にしておきます。この辺は環境依存しますが確実に1.6の使える環境であれば1.6を使った方が動作が早いような気もしますが、まだまだサーバーが1.5で動いていることが多いので。。。

javadocの設定
<plugin>
  <artifactId>maven-javadoc-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <minmemory>128m</minmemory>
    <maxmemory>512m</maxmemory>
    <encoding>UTF-8</encoding>
    <docencoding>UTF-8</docencoding>
    <charset>UTF-8</charset>
    <locales>ja</locales>
  </configuration>
</plugin>

個人的には使いませんが、とりあえず入れておきます。パッケージを作るだけであれば利用されないですしね。なんとなくDoxygen派です。でも基本的にはソースは頭で覚えるか実物見るのであまりこの手のドキュメントは使いません。

profiles

環境別のビルドファイルを作る設定を追加します。

<profiles>
  <profile>
    <id>development</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <build>
      <finalName>neko-development</finalName>
      <resources>
        <resource>
          <directory>src/main/resources</directory>
        </resource>
        <resource>
          <directory>src/main/java</directory>
        </resource>
      </resources>
    </build>
  </profile>
  <profile>
    <id>ita</id>
    ... 略 ...
  </profile>
  <profile>
    <id>itb</id>
    ... 略 ...
  </profile>
  <profile>
    <id>product</id>
    <build>
      <finalName>neko-product</finalName>
      <resources>
        <resource>
          <directory>src/product/resources</directory>
        </resource>
        <resource>
          <directory>src/main/resources</directory>
        </resource>
        <resource>
          <directory>src/main/java</directory>
        </resource>
      </resources>
    </build>
  </profile>
</profiles>

src/main/resources にデフォルト環境+開発環境
src/ita/resources に社内テストサーバー用設定(差分のみ)
src/itb/resources に本番テストサーバー用設定(差分のみ)
src/product/resources に本番サーバー用設定(差分のみ)

って使い分けをしています。中身は

env.txt 環境別にitやproductを指定
jdbc.dicon DBのIPやパスワードの設定
log4j.properties テストサーバーはdebugなど出力レベル調整
siteSetting.dicon そのサーバー特有の設定

みたいなものを入れています。デフォルトでないのがsiteSetting.diconです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
  "http://www.seasar.org/dtd/components24.dtd">
<components>
  <component name="SiteSettingService" class="neko.service.SiteSettingService">
    <property name="csvBasePath">
      "C:/neko-data/csv/"
    </property>
    <property name="siteBaseURL">
      "http://127.0.0.1:8080/neko/"
    </property>
  </component>
</components>

上記のようにサーバーによって変わってくる部分を記述します。メールとかに埋め込むサイトのURLとか、管理者のメールアドレスとかDBに設定すればいいのですが、ちょっとしたものはここで設定しています。propertiesでもいいのですが、なんとなく(笑)

package neko.service;

public class SiteSettingService {
  public String csvBasePath;
  public String siteBaseURL;
}

受側のjavaファイルです。サンプルでは何もしていませんが、実際にはURLの合成などのちょっとした処理が入っていたりします。利用するときにはこのサービスを宣言すると自動的にDIされて設定したdiconファイルの内容が初期値に入っています。

pluginRepositories

リポジトリの設定ですが利用していません。個人的にはプロジェクトで利用するファイルはすべてSVNにコミットする方針を採っているので、インターネットやイントラからのダウンロードはしない方針です。

dependencies

すべてプロジェクト内部にファイルを持ちます。これによってMaven系のプラグインのダウンロードは発生しますが、個別のライブラリのダウンロードは必要なくなります。

    <dependencies>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jsp_2.0_spec</artifactId>
            <version>2.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/geronimo-jsp_2.0_spec-1.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-servlet_2.4_spec</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/geronimo-servlet_2.4_spec-1.0.jar</systemPath>
        </dependency>
        ... 略 ...

パッケージの作り方

バッチファイルで以下のコマンドを実行しています。Eclipse上から実行するとEclipseの実行Pathからになるので、エクスプローラーかDOS窓上から実行しています。内容は本番テストサーバーと本番サーバーのパッケージになります。開発系も一緒にパッケージングしてもいいのですが、開発系はHudsonとかで自動デプロイされる環境がこのましいのと、別タイミングで作ることが多いのでこんな感じになっています。

mkdir package

call mvn clean package -P itb
copy /y target\*.war package

call mvn clean package -P product
copy /y target\*.war package

call mvn clean

全文

<?xml version="1.0" encoding="UTF-8"?><project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>neko</groupId>
    <artifactId>neko</artifactId>
    <packaging>war</packaging>
    <name>neko</name>
    <version>0.0.1</version>
    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory>
        <testOutputDirectory>target/test-classes</testOutputDirectory>
        <testSourceDirectory>src/test/java</testSourceDirectory>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
            </testResource>
        </testResources>
        <defaultGoal>validate</defaultGoal>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <id>source-jar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>add-source</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>src/main/webapp/view</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-javadoc-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <minmemory>128m</minmemory>
                    <maxmemory>512m</maxmemory>
                    <encoding>UTF-8</encoding>
                    <docencoding>UTF-8</docencoding>
                    <charset>UTF-8</charset>
                    <locales>ja</locales>
                </configuration>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-eclipse-plugin</artifactId>
                    <configuration>
                        <wtpversion>1.5</wtpversion>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
    <!--  [[profiles]]  how to use : mvn package -P product -->
    <profiles>
       <profile>
         <id>development</id>
         <activation>
           <activeByDefault>true</activeByDefault>
         </activation>
         <build>
           <finalName>neko-development</finalName>
           <resources>
             <resource>
               <directory>src/main/resources</directory>
             </resource>
             <resource>
               <directory>src/main/java</directory>
             </resource>
           </resources>
         </build>
       </profile>
       <profile>
         <id>ita</id>
         <build>
           <finalName>neko-ita</finalName>
           <resources>
             <resource>
               <directory>src/ita/resources</directory>
             </resource>
             <resource>
               <directory>src/main/resources</directory>
             </resource>
             <resource>
               <directory>src/main/java</directory>
             </resource>
           </resources>
         </build>
       </profile>
       <profile>
         <id>itb</id>
         <build>
           <finalName>neko-itb</finalName>
           <resources>
             <resource>
               <directory>src/itb/resources</directory>
             </resource>
             <resource>
               <directory>src/main/resources</directory>
             </resource>
             <resource>
               <directory>src/main/java</directory>
             </resource>
           </resources>
         </build>
       </profile>
       <profile>
         <id>product</id>
         <build>
           <finalName>neko-product</finalName>
           <resources>
             <resource>
               <directory>src/product/resources</directory>
             </resource>
             <resource>
               <directory>src/main/resources</directory>
             </resource>
             <resource>
               <directory>src/main/java</directory>
             </resource>
           </resources>
         </build>
       </profile>
    </profiles>
<!--
    <pluginRepositories>
        <pluginRepository>
            <id>maven.seasar.org</id>
            <name>The Seasar Foundation Maven2 Repository</name>
            <url>http://maven.seasar.org/maven2</url>
        </pluginRepository>
    </pluginRepositories>
    <repositories>
        <repository>
            <id>maven</id>
            <name>Maven2 Repository</name>
            <url>http://repo1.maven.org/maven2/</url>
        </repository>
        <repository>
            <id>maven.seasar.org</id>
            <name>The Seasar Foundation Maven2 Repository</name>
            <url>http://maven.seasar.org/maven2</url>
        </repository>
    </repositories>
-->
    <dependencies>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jsp_2.0_spec</artifactId>
            <version>2.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/geronimo-jsp_2.0_spec-1.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-servlet_2.4_spec</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/geronimo-servlet_2.4_spec-1.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.2</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/junit-3.8.2.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>junit-addons</groupId>
            <artifactId>junit-addons</artifactId>
            <version>1.4</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/junit-addons-1.4.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>rhino</groupId>
            <artifactId>rhino</artifactId>
            <version>1.6r2</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/rhino-1.6r2.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.teeda</groupId>
            <artifactId>teeda-webunit</artifactId>
            <version>0.2.2</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/teeda-webunit-0.2.2.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.teeda</groupId>
            <artifactId>teeda-xmlunit</artifactId>
            <version>0.1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/teeda-xmlunit-0.1.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>xmlunit</groupId>
            <artifactId>xmlunit</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/xmlunit-1.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/aopalliance-1.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.1</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/commons-collections-3.1.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>commons-el</groupId>
            <artifactId>commons-el</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/commons-el-1.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/commons-fileupload-1.2.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/commons-io-1.3.2.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/commons-logging-1.1.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jta_1.1_spec</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/geronimo-jta_1.1_spec-1.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.0.69</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/h2-1.0.69.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>jboss</groupId>
            <artifactId>javassist</artifactId>
            <version>3.4.ga</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/javassist-3.4.ga.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.1.2</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/jstl-1.1.2.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.13</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>ognl</groupId>
            <artifactId>ognl</artifactId>
            <version>2.6.9-patch-20070908</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/ognl-2.6.9-patch-20070908.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.0-FINAL</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/poi-3.0-FINAL.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.dao</groupId>
            <artifactId>s2-dao</artifactId>
            <version>1.0.49</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/s2-dao-1.0.49.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.dao</groupId>
            <artifactId>s2-dao-tiger</artifactId>
            <version>1.0.49</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/s2-dao-tiger-1.0.49.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.container</groupId>
            <artifactId>s2-extension</artifactId>
            <version>2.4.33</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/s2-extension-2.4.33.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.container</groupId>
            <artifactId>s2-framework</artifactId>
            <version>2.4.33</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/s2-framework-2.4.33.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.container</groupId>
            <artifactId>s2-tiger</artifactId>
            <version>2.4.33</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/s2-tiger-2.4.33.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.teeda</groupId>
            <artifactId>teeda-ajax</artifactId>
            <version>1.0.13-sp4</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/teeda-ajax-1.0.13-sp4.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.teeda</groupId>
            <artifactId>teeda-core</artifactId>
            <version>1.0.13-sp4</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/teeda-core-1.0.13-sp4.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.teeda</groupId>
            <artifactId>teeda-extension</artifactId>
            <version>1.0.13-sp4</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/teeda-extension-1.0.13-sp4.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.teeda</groupId>
            <artifactId>teeda-tiger</artifactId>
            <version>1.0.13-sp4</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/teeda-tiger-1.0.13-sp4.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
            <version>2.6.2</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/xercesImpl-2.6.2.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xmlParserAPIs</artifactId>
            <version>2.6.2</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/xmlParserAPIs-2.6.2.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>net.arnx.jsonic</groupId>
            <artifactId>jsonic</artifactId>
            <version>1.0.3</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/jsonic-1.0.3.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.lowagie.text</groupId>
            <artifactId>iText</artifactId>
            <version>2.1.4</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/iText-2.1.4.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.4</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/commons-lang-2.4.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.chronos</groupId>
            <artifactId>s2chronos-core</artifactId>
            <version>1.0.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/s2chronos-core-1.0.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.seasar.chronos</groupId>
            <artifactId>s2chronos-extension</artifactId>
            <version>1.0.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/s2chronos-extension-1.0.0.jar</systemPath>
        </dependency>
    </dependencies>
</project>

総括

小規模から中規模程度のTeedaプロジェクトであればリポジトリよりはプロジェクトの内部にライブラリもった方が楽だと思います。SVNにはライブラリがコミットされているけれど、パッケージの際にさらに同じものがダウンロードとかされたりしてないでしょうか? JDBCとか公開リポジトリに置いてない物がありますしね。