ラベル Maven の投稿を表示しています。 すべての投稿を表示
ラベル Maven の投稿を表示しています。 すべての投稿を表示

2015年6月25日木曜日

Maven で Cobertura を使ってみた

概要

Maven でテストコードのカバレッジを表示することができる Cobertura を使ってみました

環境

  • Mac OS X 10.10.3
  • Eclipse Luna 4.4
  • Java 1.8.0_31
  • Maven 3.2.1

pom.xml に定義する

以下を定義します
<build>-><plugins>配下に記載します

<!-- cobertura -->
<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>cobertura-maven-plugin</artifactId>
  <version>2.7</version>
  <configuration>
    <formats>
      <format>html</format>
      <format>xml</format>
    </formats>
    <instrumentation>
      <excludes>
        <exclude>**/*Test.class</exclude>
      </excludes>
    </instrumentation>
    <executions>
      <execution>
        <phase>test</phase>
        <goals>
          <goal>check</goal>
        </goals>
      </execution>
    </executions>
  </configuration>
</plugin>

記載したら実行しましょう
コマンドはmvn cobertura:coberturaです
成功するとtarget/cobertura/index.htmlが作成されるのでこれを開くとカバレッジ率を見ることができます

JavaはJREではなくJDKが必要になるので注意してください

最後に

mvn packageのライフサイクルに入れるにはどうすればいいのだろうか

2015年6月24日水曜日

Maven で Javadoc を生成する方法

概要

Maven で Javadoc を作成してみました

環境

  • Mac OS X 10.10.3
  • Eclipse Luna 4.4
  • Java 1.8.0_31
  • Maven 3.2.1

プロジェクト作成

プロジェクトは Eclipse 上で作成しました
以下の Group Id と Artifact Id を指定しています

  • Group Id・・・org.apache.maven.archetypes
  • Artifact Id・・・maven-archetype-quickstart

Javadoc 出力設定

上記 Artifact Id で作成すれば特に何もしなくても Javadoc を生成することができます
以下の goal を指定すれば作成できます

mvn javadoc:javadoc

上記で実行するとtarget/site/apidoc/index.htmlに Javadoc の index.html が生成されます
2015/06/15 現在だと使用されるmaven-javadoc-pluginのバージョンは2.10.3でした

pom.xml に定義する場合

例えば出力先や文字コードを変更したい場合はpom.xmlに記載する必要があります
<project>-><build>-><plugins>配下に以下を記載してください

<!-- Javadoc -->
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-javadoc-plugin</artifactId>
   <version>2.10.3</version>
   <configuration>
      <author>true</author>
      <source>1.8</source>
      <show>protected</show>
      <encoding>UTF-8</encoding>
      <charset>UTF-8</charset>
      <docencoding>UTF-8</docencoding>
   </configuration>
</plugin>

<version>に使用するプラグインのバージョンを指定します
<encoding>にJavaのソースファイルのエンコードを指定します
<charset>に出力するHTMLの文字コードを指定します
<docencoding>は<charset>と同じ(だと思います)

他の詳しいパラメータはここを参考にしてください

実行する場合は先ほど同様でmvn javadoc:javadocでOKです

最後に

mvn packageのライフサイクルに入れるにはどうすればいいのだろうか

2015年6月17日水曜日

Maven に findBugs を導入する方法

概要

Maven でビルドを実行した際に findBugs を同時に実行させます

環境

  • Windows 7 64bit
  • Eclipse Luna 4.4.1
  • Maven 3.2.1 ( Eclipse 組み込み版 )
  • findbugs-maven-plugin 3.0.0
  • Java SDK 1.8.0_25

設定方法

pom.xml に以下を記載します

<!-- for findbugs -->
<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>findbugs-maven-plugin</artifactId>
  <version>3.0.0</version>
  <configuration>
    <effort>Max</effort>
    <failOnError>false</failOnError>
    <threshold>Low</threshold>
    <xmlOutput>true</xmlOutput>
    <findbugsXmlOutputDirectory>${project.build.directory}/findbugs</findbugsXmlOutputDirectory>
  </configuration>
  <executions>
    <!-- Ensures that FindBugs inspects source code when project is compiled. -->
    <execution>
      <phase>test</phase>
      <goals>
        <goal>check</goal>
      </goals>
    </execution>
  </executions>
</plugin>

記載する箇所は<project>-><build>-><plugins>タグ内に記載すればOKです
mvn package でビルドすると test フェーズの後でソースの静的解析が走ります
findbugs/findbugsXml.xml に解析結果を保存してくれます

2015年5月8日金曜日

Maven でビルド時に CheckStyle を実行する

概要

Mavenビルド時に CheckStyle を適用したいと思います
CodeStyleの目的は

  • ソースの可読性をあげる
  • 無駄なコードを排除する
  • 複数人で開発している場合に変数名やクラス名などに統一性を持たせる

などあります
ビルド時に実施することで強制的にスタイルを合わせることができるので間違いも発見しやすくなります

今回はEclipseを使って基本的な設定から独自のルール設定をする方法まで紹介したいと思います

環境

  • Windows7 64bit
  • Java 1.8.0_25
  • Maven 3.2.2
  • maven-checkstyle-plugin 2.1.5
  • Eclipse 4.4 Luna
  • Eclipse CheckStyle Plugin 6.5.0

maven-checkstyle-plugin のインストール

pom.xmlを編集します
<build> -> <plugins>配下に以下を追記することでインストール可能です

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>2.15</version>
    <executions>
        <execution>
            <phase>test</phase>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <configLocation>checkstyle.xml</configLocation>
        <encoding>UTF-8</encoding>
        <consoleOutput>true</consoleOutput>
        <failsOnError>true</failsOnError>
        <linkXRef>false</linkXRef>
    </configuration>
</plugin>

Mavenビルド時のtestフェーズでCheckstyleを実施します
<configLocation>に独自のCheckstyleルールを設定することができます
ここを指定しないとデフォルトで提供されるconfig/sun_checks.xmlというルールが適用されます
それを使っても問題ないのですが、ルールが結構厳しいので今回はもう少し緩めのルールを使いたいと思います

checkstyle.xmlを作成する

その緩めのルールを作成したいと思います
ルールはデフォルトで用意されているものをコピーして作成したいと思います
デフォルトのルールをコピーするのにEclipseの「Checkstyle Plug-in」をインストールします

Checkstyle Plug-inのインストール

Help -> Eclipse Marketplace -> Search

で「checkstyle」と入力してください
以下のプラグインが検索されるのでInstall -> Finishとしてインストールしましょう
install_checkstyle_plugin.png

途中利用規約に同意してEclipseの再起動を求められるので再起動してください

再起動が完了すればインストールが完了です

デフォルトで用意されているのcheckstyle.xmlをコピーする

Window -> Preferences -> Checkstyle

と移動します
デフォルトで用意されているCheckstyleのルールが表示されます

プラグインのバージョンにもよると思いますが3種類のデフォルトルールがありました
そのうち「Google Checks」というルールがプラグインではデフォルトで使われているようです
今回はこれではなく「Sun Checks (Eclipse)」のルールを元にcheckstyle.xmlを作成します
list_default_checkstyle.png

上記の画面から「Sun Checks (Eclipse)」を選択した状態で「Copy」をクリックしてください
Typeに「External Configuration File」を選択します
Locationにはcheckstyle.xmlを保存するパスを指定します
今回はプロジェクトのカレントディレクトリを指定しましょう
create_checkstyle.png

こんな感じで入力してOKをクリックしましょう
するとプロジェクトの直下に「checkstyle.xml」というファイルができていると思います
これがCheckstyleするときに適用されるルールになります

ビルドしてみる

この状態でMavenビルドすればCheckStyleをかけることができます
testフェーズで実施されるのでmvn packageあたりでビルドすればOKです

初回はプラグインのダウンロード等が発生するので遅いですが2回目以降はスムーズに終了すると思います
maven-checkstyle-pluginのログの部分だけ抜粋すると以下のようになっていました

[INFO] --- maven-checkstyle-plugin:2.15:check (default) @ test-webapp ---
[INFO] Starting audit...
Audit done.

最終的にはBUILD SUCCESSになっていればOKです

ルールを独自に編集してみる

ルールの詳細はこちらを御覧ください

今回用意したcheckstyle.xmlはかなり緩く、そして結構謎なチェックルールが多いです
ほとんどコーティングしていない環境であれば警告はほぼでないと思いますが、結構開発していてコード量も多い場合は平気で1000とかの単位で警告が出ます
そんな場合はルールを変更して警告を無視するようなことをよくやります

例えば以下のようなコードを追加するだけで結構な警告が出るようになります

package test;

public class Test {

    private String name;

    public Test(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

出現する警告は以下の通り

[INFO] --- maven-checkstyle-plugin:2.15:check (default) @ test-webapp ---
[INFO] Starting audit...
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:0: warning: Missing package-info.java file.
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:3: warning: Javadoc コメントがありません。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:5:5: warning: Javadoc コメントがありません。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:7:5: warning: Javadoc コメントがありません。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:7:17: warning: Parameter name should be final.
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:7:24: warning: 'name' がフィールドを隠しています。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:12:5: warning: Javadoc コメントがありません。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:12:5: warning: メソッド 'getName' は拡張するように設計されていません - abstract か final か空である必要があります。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:16:5: warning: Javadoc コメントがありません。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:16:5: warning: メソッド 'setName' は拡張するように設計されていません - abstract か final か空である必要があります。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:16:25: warning: Parameter name should be final.
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:16:32: warning: 'name' がフィールドを隠しています。
Audit done.

今回の設定の場合は緩いルールを使っているので警告として怒られるのでビルド自体は最後までいきます
主に怒られるのはJavadoc系になると思います
Eclipse等のIDEで開発している場合IDE自体がある程度フォーマットしてくれるのでスペースがない等のエラーはあまり見ないと思います
ではこの警告の一部を無視する設定を紹介します

Checkstyleの警告を無視する設定を追加する

設定はEclipseであればGUIを使って行うことができます
もちろんcheckstyle.xmlを直接編集してXMLを書き直すでもOKです

Window -> Preferences -> Checkstyle

でプラグインに登録されているルールの一覧を表示したら今回のプロジェクトが使っているルールをダブルクリックしてください
するとルールを設定するウィンドウが表示されるのでここで

Javadoc Comments -> Package Javadoc

のチェックボックスをOFFにしてください
OFFにしたらOKでウィンドウを閉じてください
ignore_package_info_warning.png

これでcheckstyle.xmlの方にも設定を反映することができます
一旦ウィンドウを閉じて再度mvn packageでビルドしてみてください

再度ビルドしてみる

ビルドの結果を見てみましょう
すると先ほど警告されていた先頭の

warning: Missing package-info.java file.

が警告されなくなっているのがわかると思います

こんな感じでルールの編集を行うことができます
GUIからだと割りと直感的にルールを編集することができます
それでも英語のkeywordから何を設定しているのかを読み解く部分も出てくると思いますので
その場合はドキュメントを読むなりWebで調べるなりする必要が出てきます

最後に

導入自体は割りと簡単に行えますが導入後に自分でルールを調整しなければいけなく、XMLとの戦いを避けられないのが辛いところです

それでも一度導入できてしまえば再度変更することはほとんどないと思うので、それと比較するとCheckStyleを導入する恩知は大きいと思います

個人で開発する分には導入するメリットはそれほど無いかもしれませんが、チームで開発していたりオープンソースとして公開することを目標にしているのであれば
むしろ導入は必須と言っていいかもしれません

2015年5月7日木曜日

buildnumber-maven-plugin を使って war ファイル内の Manifest.MF にリビジョン情報を埋め込む

概要

作成したwarの中にgitのリビジョン情報があると何かと便利です
いつのコミットから生成されたwarなのか知りたいケースは多いと思います
Mavenを使ってリビジョン情報を埋め込むことができたので紹介します

環境

  • Windows7 64bit
  • Java 1.8.0_25
  • Maven 3.2.2
  • buildnumber-maven-plugin 1.3
  • maven-war-plugin 2.6

Mavenでサンプル用のWebアプリプロジェクトを作成

適当に作成すればOKです
すでにmvn packageでwarが作成できるプロジェクトがあればそれでもいいです
ない場合はこちらを参考に作成してください
Eclipseの場合はMavenプロジェクトを作成する際にアーティファクトIDにmaven-archetype-webappを選択してサンプルプロジェクトを作成してください

また、今回はプロジェクト自体がgitリポジトリで管理されていることを想定しているのでプロジェクトをgit化してください
リモートリポジトリはなくてもいいのでgit initできていればOKです
Eclipseの場合は

Team -> Share Project -> Git -> Use or create repository in parent folder or project -> Create Repository

としてgit化してください

そしてgit add->git commitとしてはじめのコミットを作成しておきましょう

buildnumber-maven-pluginの設定

pom.xmlを編集します
<build> -> <plugins>タグ内に以下のプラグインを追加します

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId>
    <version>1.3</version>
    <executions>
        <execution>
            <phase>validate</phase>
            <goals>
                <goal>create</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <doCheck>false</doCheck>
        <doUpdate>false</doUpdate>
    </configuration>
</plugin>

上記を記載することでbuildnumber-maven-pluginが有効になります

ポイントはdoCheckとdoUpdateのタグの部分です
falseを設定することで以下の効果があります

  • git statusを使って差分チェックをしなくなります
  • git pullをして最新のソースをremoteからマージしなくなります

上記が有効だとmvnビルドするのにいちいちgitコミットしなければいけないのとgit pullをするための認証情報の設定を別途記載する必要があります
trueでも設定さえちゃんとされていればビルドは次に進みますが個人的にはyak shavingしているだけの印象だったのでfalseを設定しました
また、falseを設定することでgitコマンド自体が不要になるのでEclipse上でmvnビルドしている場合は

[ERROR] ‘git’ は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。

というエラーが出るのを回避することもできます

warをアーカイブするときにManifest.MFを拡張

Manifest.MFを拡張するにはmaven-war-pluginを定義し直します
pom.xmlを編集します
<build> -> <plugins>タグ内に以下のプラグインを追加します

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>war</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <archive>
            <manifestEntries>
                <Implementation-ScmBranch>${scmBranch}</Implementation-ScmBranch>
                <Implementation-Build>${buildNumber}</Implementation-Build>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

ポイントは<archive> -> <manifestEntries>内の2つの宣言で特にvalueの変数が重要です
buildnumber-maven-pluginを有効にすることで${scmBranch}と${buildNumber}という変数が使えるようになります
ここで指定するタグは何でもOKです
記載したタグ情報がそのままManifest.MFに記載されることになります

scm の設定を追記

どこのgitのリビジョン情報を参照するのかpom.xml内に記載する必要があります
この設定は<project>タグ直下に記載してください

この定義がないとcreate failed: The scm url cannot be null.という言われて怒られます
以下の設定をpom.xmlに記載します

<scm>
    <connection>scm:git:file://.</connection>
    <developerConnection>scm:git:file://.</developerConnection>
    <url>scm:git:file://.</url>
    <tag>HEAD</tag>
</scm>

今回の想定はプロジェクト自体がgitで管理されていることを想定しています
なのでプロジェクト自体を指し示すようにscmを定義します
もちろんここにはGithubのURLやイントラネット内にあるgitリポジトリを指定することも可能です

ビルドしてみる

ここまで設定できたらビルドしてみましょう
コマンドで実行する場合は
mvn package
でOKです

Eclipseで実行する場合はRun As -> Maven build でgoalsにpackageを指定して実行しましょう

ビルドが成功するとtargetディレクトリ配下にwarファイルが作成できています
このwarファイルを解凍してMETA-INF/Manifest.MFを見てみましょう
以下のようにリビジョン情報とビルドしたブランチ情報が追記されていればOKです

Manifest-Version: 1.0
Built-By: kakakikikeke
Build-Jdk: 1.8.0_25
Implementation-ScmBranch: master
Created-By: Apache Maven 3.2.1
Implementation-Build: 29fb55a9daa2afc3961b9759d0f4e50ca3cac281
Archiver-Version: Plexus Archiver

紹介は以上です
今回はリビジョン情報を埋め込みましたがManifest.MFには他にもいろいろな情報を埋め込めるので好きな情報を埋め込むといいと思います

参考サイト

2014年12月20日土曜日

Mavenでmainメソッドを実行する方法

概要

src/main/java … に作成されたクラス内にmainメソッドを書いて実行させる方法を紹介します

環境

  • CentOS release 5.10 (Final)
  • Maven 3.1.0
  • exec-maven-plugin 1.2.1

設定

exec:javaというゴールを指定してmvn実行します

pom.xml設定

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.2.1</version>
      <configuration>
        <mainClass>com.kakakikikeke.sample.App</mainClass>
      </configuration>
    </plugin>
  </plugins>
</build>

変更すべき箇所は<mainClass>です
環境に合わせてパッケージ名から指定してください
App.javaにはmainクラスが含まれる必要があります

また、上記のタグは<project>タグ直下に記載してください

実行

mvn clean compile exec:java

実行されると以下のような感じで表示されます(System.out.printlnの場合、start, endの部分)

... 略 ...

[INFO] >>> exec-maven-plugin:1.2.1:java (default-cli) @ jedis >>>
[INFO]
[INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ jedis <<<
[INFO]
[INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ jedis ---
start
end
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.842s
[INFO] Finished at: Thu Dec 18 16:40:41 JST 2014
[INFO] Final Memory: 13M/206M
[INFO] ------------------------------------------------------------------------

Mavenの場合ロジック側を動かそうとするとテストかかないとダメなので、ちょっと動作させたいときにはいいかなと
めちゃくちゃ見づらいですが。。

2014年12月19日金曜日

Mavenで実行可能Jarを作成する方法

概要

「jar -jar hoge.jar」みたいな感じで実行できるjarを作成する方法です
packageのゴールを使って生成できるようにします

環境

  • CentOS release 5.10 (Final)
  • Maven 3.1.0
  • maven-assembly-plugin 2.5.2

設定

pom.xml設定

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>2.5.2</version>
      <configuration>
        <finalName>App</finalName>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
          <manifest>
            <mainClass>com.kakakikikeke.sample.App</mainClass>
          </manifest>
        </archive>
      </configuration>
      <executions>
        <execution>
          <id>make-assembly</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal> <!-- goals == mojos -->
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

変更すべき箇所は<mainClass>です
環境に合わせてパッケージ名から指定してください
<finalName>で作成するJarのprefixを指定できます

また、上記のタグを<project>タグの直下に記載してください

実行

mvn clean compile package

完了するとtarget配下にtarget/App-jar-with-dependencies.jarというjarファイルができていると思います
実行する場合は

java -jar target/App-jar-with-dependencies.jar

で実行してください
実行可能jarなので必要なライブラリやクラスファイルは全部jarの中に同梱されています

2014年7月4日金曜日

Windows + MavenでSeleniumのUIテスト

■環境
Windows7 64bit
Java 1.7.0_25
Maven 3.1.1
Selenium API 2.42.2
Firefox 30.0

■プロジェクト作成
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=com.sample.selenium -DartifactId=selenium_test
※maven-archetype-quickstart を使います

バージョンを入力し内容の確認に答えればOKです(そのままエンターでOKです)

■pom.xml編集
作成されたpom.xmlを以下の用に編集してください
Seleniumのライブラリを使用する定義を追加します

<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-api</artifactId>
  <version>2.42.2</version>
</dependency>
<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-java</artifactId>
  <version>2.42.2</version>
</dependency>

mvn clean install
するとライブラリがダウンロードされてきます

ついでにMaven経由でJavaを実行するためのプラグインもインストールします
<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.2.1</version>
      <configuration>
        <mainClass>com.sample.selenium.App</mainClass>
      </configuration>
    </plugin>
  </plugins>
</build>

■サンプルテストコード
emacs src/main/java/com/sample/selenium/App.java

package com.sample.selenium;

import com.thoughtworks.selenium.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.*;

public class App {

  private static int SLEEP_TIME = 5000;
  
  public static void main(String args[]) throws Exception {
    new App().updateRanking();
  }

  public void updateRanking() throws Exception {
    FirefoxProfile profile = new FirefoxProfile();
    profile.setAcceptUntrustedCertificates(true);
    FirefoxDriver driver = new FirefoxDriver(profile);

    driver.get("http://fc2.com/login.php?ref=blog");
    driver.findElement(By.id("id")).click();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.id("id")).sendKeys("username");
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.id("pass")).click();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.id("pass")).sendKeys("password");
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.name("image")).click();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.linkText("プラグインの設定")).click();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.xpath("(//a[contains(text(),'詳細')])[2]")).click();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.linkText("【HTMLの編集】")).click();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.name("value1")).clear();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.name("value1")).sendKeys("test contents for plugins in side bar");
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.cssSelector("input.submitAddButton")).click();
    Thread.sleep(SLEEP_TIME);
    driver.quit();
  }

}

完全にプライベートなソースコードですが
fc2 blogにログインしてサイドバーの内容を更新するサンプルです
XML-RPCでは記事本文しか自動更新できないのでサイドバー等はUIを使って変更するしかありません

mvn clean compile
でソースをコンパイルします
M2_HOME等のmavenの設定がうまくできていれば問題なくコンパイルできるかと思います

■サンプルの実行
mvn clean compile exec:java

とコマンドプロンプト上で実行するとFirefoxが立ち上がりブラウザが自動で動きはじまると思います
ネットワーク等が重く動作が安定しない場合はSLEEP_TIMEを5000から10000(10秒)等に変更して試してみてください

以上です
MavenからSeleniumを動作させることができました
SeleniumIDEでJavaのソースコードをExportする場合はJUnitかTestNGのどちらかでテスト形式であることが前提なので
必ずテストコードにする必要がありましたが、それを書き換えて通常のJavaプロジェクトとして動作させてみました
また、今回はWindows環境で実施しましたが、Seleniumのテストを実施する場合どうしてもGUI環境が必要になるので
仕方なくWindows環境を使用しました
Mac または X のあるLinux環境でも問題なく動作すると思います

■参考サイト

■Tips
maven の場合は依存関係をいい感じの解決してくれたのですが、
maven を使わない場合はselenium系の jar 以外に Guava や Json のライブラリで40個以上必要になるみたいです
http://stackoverflow.com/questions/9699997/selenium-2-webdriver-noclassdeffounderrors

なので通常のJavaプロジェクトの場合はselenium-server-standalone-2.39.0.jarを使ってあげるといろいろな jar をインストールしなくて済むので楽です

2014年6月18日水曜日

MavenでWebアプリをモダンに開発

前回、maven+testngでモダンにテスト開発をしてみました
今回はmavenを使ってサーバサイドだけでWebアプリ開発ができないか頑張ってみました

■環境
CentOS release 5.10 (Final)
JDK 1.7.0_05
Maven 3.1.1
Tomcat 7.0.27
Servlet API 3.0.1

■プロジェクトの作成
mvn archetype:generate -DgroupId=com.sample.webapp -DartifactId=webapp-quick-start -DarchetypeArtifactId=maven-archetype-webapp

※versionとGroupIdの入力は特に指定しませんでした
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] Using property: groupId = com.sample.webapp
[INFO] Using property: artifactId = webapp-quick-start
Define value for property 'version':  1.0-SNAPSHOT: :
[INFO] Using property: package = com.sample.webapp
Confirm properties configuration:
groupId: com.sample.webapp
artifactId: webapp-quick-start
version: 1.0-SNAPSHOT
package: com.sample.webapp
 Y: :
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-webapp:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.sample.webapp
[INFO] Parameter: packageName, Value: com.sample.webapp
[INFO] Parameter: package, Value: com.sample.webapp
[INFO] Parameter: artifactId, Value: webapp-quick-start
[INFO] Parameter: basedir, Value: /var/tmp/maven
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /var/tmp/maven/webapp-quick-start
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.472s
[INFO] Finished at: Tue Jun 17 19:53:57 JST 2014
[INFO] Final Memory: 12M/30M
[INFO] ------------------------------------------------------------------------

webapp-quick-start というフォルダが作成されていることを確認します
ついでにパッケージ用のディレクトリも作成します

ls -ltr webapp-quick-start/
合計 8
drwxr-xr-x 3 root root 4096  6月 17 19:53 src
-rw-r--r-- 1 root root  746  6月 17 19:53 pom.xml

mkdir -p webapp-quick-start/src/main/java/com/sample/webapp

■サンプルアプリ作成
dependencies 内にservlet-apiを使うためのライブラリの定義を記載します

emacs webapp-quick-start/pom.xml
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.0.1</version>
  <scope>compile</scope>
</dependency>

メインとなるクラスを作成します

emacs webapp-quick-start/src/main/java/com/sample/webapp/TestWebApp.java
package com.sample.webapp;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TestWebApp extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println( "Hello World!!!" );
        out.flush();
        out.close();
    }
}

Webコンテナの定義を記載します

emacs webapp-quick-start/src/main/webapp/WEB-INF/web.xml
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>TestWebApp</servlet-name>
    <servlet-class>com.sample.webapp.TestWebApp</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestWebApp</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

■ビルド
cd webapp-quick-start
mvn clean compile package

■デプロイ
cp target/webapp-quick-start.war /usr/local/tomcat/webapps/
service tomcat restart

tomcatのデプロイ先のディレクトリは各自の環境に合わせてください
tomcatの再起動コマンドも各自の環境に合わせてください
再起動はtomcatのオートデプロイがONになっていれば再起動不要です

■動作確認
http://localhost:8080/webapp-quick-start/hello

にアクセスして「Hello World!!!」が表示されることを確認してください
Tomcat ManagerにアクセスするとデプロイしたWebコンテナ情報が登録されていることもわかるかと思います


何とかサーバサイドだけで開発できる環境ができました
Javaを書き換えたり、pom.xmlを書き換えたりした場合は
「mvn clean compile package」->「cpでデプロイ」の流れを実施すれば変更を確認することができます

以下、やったみた感想です
  • MavenのXMLを記述するところがJavaらしいとというか、RubyやPHPみたいにモダン開発できない(慣れればできる?)
  • HelloWorldのサンプルを作成するだけなのにコード量が多すぎるのが残念
  • scaffold的な感じをJavaでもやりたかったのが動機
  • 今回は通常のWebアプリ(サーブレットコンテナ)でのやり方でだったが spring.io や PlayFramework を使えばもっと簡単にできるはず

■参考サイト

■Tips
http://localhost:8080/webapp-quick-start/
にアクセスするとsrc/main/webapp/index.jspの情報が表示されます

web.xmlのurl-mappingに「/」のみ記載するとwebapp-quick-start/aaa, webapp-quick-start/bbbと/配下の何にアクセスしてもサンプルの内容が表示されます

どうしてもEclipseで開発したい場合は「maven eclipse:eclipse」するとEclipseにインポートできるようになります

2014年4月12日土曜日

maven clean時にtarget配下以外のファイルも削除する方法

■環境
CentOS release 6.3 (Final)
Apache Maven 3.1.1
java version "1.6.0_24"

■プロジェクト作成
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.kakakikikeke.test -DartifactId=sampleProject
    ※バージョン情報やスナップショットファイル名は適当に設定します
    ※groupIdやartifactIdは適宜変更して問題ございません

■pom.xml編集
1. 他のファイルを削除する定義を追加
dependencies直後に以下を記載します
maven-clean-pluginを使って不要なファイルを削除します
maven-clean-pluginはデフォルトで使用できるプラグインですが、再定義することでtarget以外のファイルもclean時に削除することができます
以下の例ではtarget以外の2種類のファイルを削除しています
  • conf/config.properties
  • test_data/*.tsv
<build>
  <plugins>
    <plugin>
      <artifactId>maven-clean-plugin</artifactId>
      <configuration>
        <excludeDefaultDirectories>true</excludeDefaultDirectories>
        <filesets>
          <fileset>
            <directory>conf</directory>
            <includes>
              <include>config.properties</include>
            </includes>
          </fileset>
          <fileset>
            <directory>test_data</directory>
            <includes>
              <include>*.tsv</include>
            </includes>
          </fileset>
        </filesets>
      </configuration>
    </plugin>
  </plugins>
</build>

2. テストしてみる
mvn clean

を実行してtargetディレクトリと上記で指定したファイルが削除されていることを確認してください
ディレクトリやファイルが存在しない場合はERRORとならずビルドが成功します

■Tips
更に他のディレクトリ配下のファイルを削除したい場合はfilesetタブを増やしていけばOKです

maven-clean-pluginでpom.xml自身も削除することができてしまうので定義する際は十分に注意してください
間違って削除する定義がある状態でmvn cleanすると大変なことなるかもしれません。。

2014年4月11日金曜日

mavenで環境ごとに異なる設定ファイルをコピーする方法

例えば開発環境(dev)ステージング環境(stg)サービス環境(service)といった感じでそれぞれに設定ファイルが存在している場合に
いちいち設定ファイルを環境用に書きなおしてビルドするのは大変です。
今回はmavenの「プロファイル」という機能を使って環境ごとのプロパティファイルを用意しmavenコマンドでデプロイするファイルを操作したいと思います

■環境
CentOS release 6.3 (Final)
Apache Maven 3.1.1
java version "1.6.0_24"

■プロジェクト作成
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.kakakikikeke.test -DartifactId=sampleProject
    ※バージョン情報やスナップショットファイル名は適当に設定します
    ※groupIdやartifactIdは適宜変更して問題ございません

■pom.xml編集
1. 環境ごとの設定を追加
dependenciesタグの直後に以下を記載します
dev, stg, serviceごとにプロファイルを作成します
プロファイルごとに「configFileDirectory」という名前のプロパティ名が異なる点がポイントです
properties機能は変数のような機能で「${configFileDirectory}」とすることで値を参照することができます
今回は「configFileDirectory」としていますが好きな変数名を設定することが可能です
<profiles>
   <profile>
      <id>dev</id>
      <properties>
         <configFileDirectory>dev</configFileDirectory>
      </properties>
   </profile>
   <profile>
      <id>stg</id>
      <properties>
         <configFileDirectory>stg</configFileDirectory>
      </properties>
   </profile>
   <profile>
   <id>service</id>
      <properties>
         <configFileDirectory>service</configFileDirectory>
      </properties>
   </profile>
</profiles>

2. 環境ごとのディレクトリと設定ファイルを作成
mkdir -p conf/dev
mkdir -p conf/stg
mkdir -p conf/service

echo "dev" > conf/dev/config.properties
echo "stg" > conf/stg/config.properties
echo "service" > conf/service/config.properties

    ※今回はテストなので適当な設定ファイルを用意します

3. コピーするルールを記載する
先ほど記載したprofilesタグの直後に記載します
「maven-resources-plugin」を利用してファイルをコピーします
ポイントは
  • phaseタグで「compile」を指定している点
  • directoryタグで「conf/${configFileDirectory}」を指定している点
pharseタグで「compile」を指定することでmavenコマンド実行時のgoalsに「compile」が指定されている場合にだけこのコピーの動作は実行されるようになります
またdirectoryタグに「conf/${configFileDirectory}」と記載することで、プロファイルで設定された「${configFileDirectory}」を元に適切なディレクトリ配下からプロパティファイルをコピーし、outputDirectory配下にファイルを配置することができます
<build>
  <plugins>
    <!-- for resources copy -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-resources-plugin</artifactId>
      <version>2.6</version>
      <executions>
        <execution>
          <id>copy-resources</id>
          <phase>compile</phase>
          <goals>
            <goal>copy-resources</goal>
          </goals>
          <configuration>
            <resources>
              <resource>
                <directory>conf/${configFileDirectory}</directory>
                <filtering>true</filtering>
              </resource>
            </resources>
            <outputDirectory>conf</outputDirectory>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

4. テストしてみる
mvn clean compile -P service

として実行すると
conf/client.propertiesにはserviceと記載されたプロパティファイルが配置されていることがわかります
「-P profile_name」
とすることでプロファイルを変更することができますので「dev」や「stg」と変更して実行することでconf/client.properties配下の内容が変わっていることがわかると思います

■Tips
複数のディレクトリ配下のファイルをコピーしたい場合は</execution>タグを複数記載すればOKです
その場合「id」タグの情報が重複すると怒られるので「copy-resources-2」などとすれば大丈夫です

2014年3月19日水曜日

Mavenプロジェクトにコンバートしたがプロジェクトエクスプローラで src/main/java配下にパッケージが作成されずにsrc配下にパッケージが作成されてしまう場合の対処方法

タイトルが長くてすいません

原因はプロジェクトのフォルダ直下にある.classpathの記述がおかしいからです

.classpathファイルを以下に変更してeclipseを再起動してください
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
        <classpathentry kind="src" output="target/classes" path="src/main/java">
                <attributes>
                        <attribute name="optional" value="true"/>
                        <attribute name="maven.pomderived" value="true"/>
                </attributes>
        </classpathentry>
        <classpathentry kind="src" output="target/test-classes" path="src/test/java">
                <attributes>
                        <attribute name="optional" value="true"/>
                        <attribute name="maven.pomderived" value="true"/>
                </attributes>
        </classpathentry>
        <classpathentry kind="src" path="src/main/resources"/>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
                <attributes>
                        <attribute name="maven.pomderived" value="true"/>
                </attributes>
        </classpathentry>
        <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
                <attributes>
                        <attribute name="maven.pomderived" value="true"/>
                </attributes>
        </classpathentry>
        <classpathentry kind="output" path="target/classes"/>
</classpath>

Mavenプロジェクト用と通常のJava用のプロジェクトでは.classpathのファイルのフォーマットが異なるので書き換えてあげる必要があります
通常のJavaプロジェクトからMavenプロジェクトにコンバートする際には気をつけてください

また上記のファイル内容の場合はsrc/main/resourcesも必要になりますのでない場合は作成するか.classpathファイルから定義を削除してください

2014年1月8日水曜日

【maven】getClass().getResourceAsStream("hogehoge.properties")でNullPointerException

target/test-classes/com/hogehoge.properties

にプロパティファイルを配置する必要がありました
src配下にいくら置いても実際にコンパイルした.classファイルはtarget配下にできるのでプロパティファイルもtarget配下にコピーしてやる必要があります
mavenでは自動でコピーしてくれる機能が備わっており

src/test/resources
に必要なプロパティファイルを置いておくと「target/test-classes」に自動でコピーし
src/main/resources
に必要なプロパティファイルを置いておくと「target/classes」に自動でコピーしてくれます

また、resources配下にディレクトリも作成しておくとそのディレクトリ階層に合わせてプロパティファイルをコピーしてくれます

pom.xmlには特にpluginの設定を書く必要はありません
内部的にはmaven-resources-pluginを使用しているようですが、デフォルトで使用できるのでフォルダを作成してプロパティファイルを配置すれば自動でコピーしてくれます

2013年10月31日木曜日

mavenとtestngでJavaのテストコードをモダンに開発

■概要
rubyやpython, phpなどのスクリプト言語にあるパッケージ管理ツール「gem」「easy-install」「composer」などを使って
サーバサイド上で簡単にソースが書けちゃうってやつを頑張ってJavaでやるとこうなったというのを紹介します
頑張れば、できなくなないです。。。

■環境
CentOS 5.9 64bit
maven 3.1.0
Java 1.7.0_05
※Javaのインストールに関しては
http://kakakikikeke.blogspot.jp/2012/06/centosjenkinsjavatomcatantgit.html
※mavenのインストールに関しては
http://kakakikikeke.blogspot.jp/2013/10/maven.html

■開発
1. mvnプロジェクトを作成する
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.kakakikikeke.test -DartifactId=Sample_Test

2. testngをダウンロードする
vim pom.xml
<dependencies>...</dependencies>の間に以下を追記する
※記載したあ、とデフォルトで入っているJUnitのdependencyの記載を削除して大丈夫です
<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>6.3.1</version>
  <scope>test</scope>
</dependency>
mvn clean
mvn compile

すると以下のローカルのリポジトリにパスにjarファイルがダウンロードされます
/root/.m2/repository/org/testng/testng/6.3.1/
※mvn clean と mvn compile はやらなくても記載して保存した段階で勝手にmavenがダウンロードしてきてくれます

3. テストケースを書く(サンプル)
vim src/test/java/com/kakakikikeke/test/AppTest.java
package com.kakakikikeke.test;

import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;

public class AppTest {

  @BeforeTest
  public void beforeTest() {
    System.out.println("beforeTest");
  }

  @AfterTest
  public void afterTest() {
    System.out.println("beforeTest");
  }

  @Test
  public void TestCase1() {

  }
}
と記載したら

mvn clean
mvn test-compile
mvn test

でtestngのテストが実行されます
あとはTestCase1に肉付けして行ったり、TestCase2を作成したりすれば一応「mvn」コマンドだけでテストケースを書いて実行することができます


とここまで環境が整っていざ開発となると、実は正直かなりめんどくさかったです。。。
以下、具体的にいけてない感じた点です
  • ライブラリを追加するときにいちいち maven repository から必要なライブラリを見つけてそのXML情報をpom.xmlに記載する必要がある
  • maven repository の検索性能がイマイチで自分が必要としているライブラリがなかなか見つからない
  • 全然関係ないライブラリを追加していることがある
  • mvn clean から test までの流れを毎回やるのが正直めんどくさい(シェルを一つ書いて一回でできるようにするとか独自のgoalを作るとかはありますが)
  • やっぱりJavaはサジェストがエディタににないと厳しい(このへんは emacs とかでもなんとかなりますが、準備が大変。。。)
といった印象を受けました
最終的にはあきらめて「mvn eclipse:eclipse」とかでeclipse形式に吐き出してeclipseにインポートして開発するのが一番楽なのかなと思ってしまった次第です
本当に枠組みだけ作るのであれば紹介した手順だけでもいいのかなーと思いました

2013年10月27日日曜日

mavenコマンドの使い方(主にgoal)について調べたのでメモ

■環境
CentOS 5.9 64bit
maven 3.1.0
Java 1.7.0_05
mavenのインストール方法は以下を参照
※http://kakakikikeke.blogspot.jp/2013/10/maven.html

■プロジェクトの作成
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=my-app

通常のJavaプロジェクトを作成する場合のパラメータです
archetypeGroupIdは後述にもありますが、mavenで用意されたテンプレートみたいなものを設定します(独自で作成することも可能)
groupIdはいわゆるパッケージ名です
artifactIdはいわゆるプロジェクト名です

コマンド実行時に入力が必須の部分もあるので入力必須の項目のサンプルを以下に記載します
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 312:
  enter入力
Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
  enter入力(1.1)
Define value for property 'version':  1.0-SNAPSHOT: :
  enter入力
確認
  Confirm properties configuration:
  groupId: com.mycompany.app
  artifactId: my-app
  version: 1.0-SNAPSHOT
  package: com.mycompany.app

■goal検証
maven自体にはgoalと呼ばるmvnコマンドに渡す引数がいろいろと用意されており
そのgoalの指定によりjarを作ってくれたりとかテストしてくれたりとか.classファイルを作ってくれたりとか振る舞いが変わってきます
基本はこのgoalの種類と動きがある程度わかっていればmvn自体は使えるようになると思います

またプラグインという概念があり、振る舞いをいろいろと変更、拡張できるのでメジャーなプラグインさえ覚えておけば大丈夫だと思います
プラグインは独自で作成することも可能です

ここで紹介するgoalやプラグインが全てではないので他のgoalについては以下のページなどを確認してください
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

以下で紹介するコマンドはプロジェクト配下のディレクトリ(今回だとmy-app)配下でpom.xmlがあるところで実行してください

・mvn compile
target/classes 配下にjavaコンパイルした.classファイルを作成してくれます

・mvn test-compile
target/test-classes 配下にコンパイルしたテスト用.classファイルを作成してくれます

・mvn test
target/classes 配下にjavaコンパイルした.classファイルを作成し
target/test-classes 配下にコンパイルしたテスト用.classファイルを作成し
target/surefire-reports 配下にテスト結果を作成してくれます
mavneデフォルトのテストツールは「JUnit」となっておりpom.xml内でdependencyが定義されています

・mvn package
target 配下にjarファイルを作成し
target/classes 配下にjavaコンパイルした.classファイルを作成し
target/test-classes 配下にコンパイルしたテスト用.classファイルを作成し
target/mavne-archiver 配下にpom.properties(プロジェクトのメタ情報ファイル?要調査)を作成し
target/surefire-reports 配下にテスト結果を作成してくれます
「jar:jar」「compile」「test-compile」「test」等をまとめて実行してくれるgoalです
test結果に関してはSurefireプラグインというプラグインを使っているようでテスト結果を統計的に見れるファイルも作成してくるようです
http://maven.apache.org/surefire/maven-surefire-report-plugin/

・mvn clean
target ディレクトリを削除してくれます
「compile」「test-compile」「test」「package」等を実行する前には実行する必要があります

・mvn install
作成した成果物(jarファイル)をローカルのmavenリポジトリに配備してくれます
具体的なパスは例えばrootユーザで実行した場合は
/root/.m2/repository/com/mycompany/app/my-app/1.0-SNAPSHOT/
配下にjarやxmlファイルを展開してくれます
他のプロジェクトが成果物を参照する必要がある場合に実施します

・mvn archetype:generate
指定できる主なオプションは以下があります
  • -DarchetypeGroupId・・・作成するプロジェクトの元となるarchetypeを入力します
  • -DgroupId・・・パッケージ名を入力します
  • -DartifactId・・・プロジェクト名を入力します
groupIdやartifactIdは任意の値を入力することができます
archetypeGroupIdに関してはMavenCentralで公開されているarchetypeGroupIdを指定しなければいけません
ただ量が膨大で覚えるのはほぼ不可能です
なので省略することもでき、省略した場合はプロジェクトを作成するときにどのarchetypeGroupIdを使用するか選択することができます
一覧がずっと出てきて番号を入力することでarchetypeGroupIdを選択することができます
ただ、この一覧もものすごい量が出てくるので選択するのが結構大変です

・mvn site
pom.xmlをもとにプロジェクトの情報をHTML形式に吐き出してくれます
現在使用しているプラグイン読み込んでいるjarファイルの一覧等が確認できます

・mvn idea:idea
InteliJ形式のフォルダ構成に変換してくれる
InteliJからインポートすればコマンドで作成したプロジェクトをInteliJ上で開発できます
my-app.iml, my-app.ipr, my-app.iwsを作成してくれます

・mvn eclipse:eclipse
上記のeclipse版
.classpath, .projectを作成してくれます

■プラグインに関して
主なプラグインについて紹介します
デフォルトの状態でもメジャーなプラグインはすぐに使える状態にあります

・mvn jar:jar
target 配下にjarファイルを作成してくれます
http://maven.apache.org/plugins/maven-jar-plugin/

・mvn war:war
target 配下にwarファイルを作成してくれます
http://maven.apache.org/plugins/maven-war-plugin/

今回の場合通常のJavaプロジェクトでWebアプリ用のプロジェクトではないので失敗すると思います
具体的にはweb.xmlの定義に失敗するのですが、冒頭のプロジェクト作成時の
archetypeGroupIdをwebアプリ用で指定してプロジェクトを作成するとwarファイルの作成もうまくいきます
サンプルは以下の通りです
mvn archetype:generate -DarchetypeGroupId=maven-archetype-webapp -DgroupId=com.mycompany.web.app -DartifactId=my-web-app

他のarchetypeGroupId関しては以下を参照してみてください
http://maven.apache.org/guides/introduction/introduction-to-archetypes.html

■所感
mavenリポジトリがグローバルにアクセスできないと使えないのでグローバルに接続できる環境は必須
プロキシ等の環境の場合、pom.xmlを修正しないといけない等、若干ハードルが高くなる

■参考

2013年10月2日水曜日

mavenのインストール方法

■環境
CentOS 5.9
Java 1.7.0_05
※JAVA_HOME等の設定まで必要
maven 3.1.0

■インストール方法
cd /var/tmp
wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz
  ※wgetできない場合はhttp://ftp.meisei-u.ac.jp/mirror/apache/dist/maven/maven-3/にアクセスして存在しているmavenバージョンに変更してからwgetしてください
tar xvzf apache-maven-3.1.0-bin.tar.gz
mv apache-maven-3.1.0 /usr/local/
cd /usr/local/
ln -s apache-maven-3.1.0/ maven

vim /root/.bashrc
export M2_HOME=/usr/local/maven
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
source /root/.bashrc

mvn -v
Apache Maven 3.1.0 (893ca28a1da9d5f51ac03827af98bb730128f9f2; 2013-06-28 11:15:32+0900)
Maven home: /usr/local/maven
Java version: 1.7.0_05, vendor: Oracle Corporation
Java home: /usr/local/java/jdk1.7.0_05/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "2.6.18-238.el5", arch: "amd64", family: "unix"

■参考サイト

2013年8月1日木曜日

eclipseでmavenプロジェクトとTomcat7を連携する方法(デプロイ)

■概要
mavenプロジェクトをeclipse上で作成しそのままtomcat上にデプロイする方法を紹介します

■環境
Windows7(64bit)
maven3.0.4(eclipse組み込み版)
eclipse3.7(m2eclipse, mongrel)
Java1.7.0_17
Tomcat7.0.42

■プロジェクト作成
Mavenプロジェクトを作成します
プロジェクトエクスプローラから新規→その他→Mavenプロジェクトを選択します
eclipseでMavenプロジェクトを作成するためには「m2eclipse」プラグインをインストールする必要がありますのでインストールしていない場合はEclipseマーケットプレイスからインストールしてください


作成時のポイントとしてはアーティファクトId「maven-archetype-webapp」を選択してください


グループIDにはプロジェクトを作成する組織名をアーティファクトIDには実際に作成される成果物名を記載します
またそのままパッケージ名にも使われるので例えば
グループID「com.kakakikikeke.sample」アーティファクトID「maven.tomcat」とするとパッケージ名は「com.kakakikikeke.sample.maven.tomcat」となります
それ以外は次へを押していけば大丈夫です
これでプロジェクトの作成は完了です

■プロジェクトの設定
プロジェクトを右クリックしビルドパスの構成からJavaのバージョンを変更します
デフォルトではJ2EEの1.5になっているためJava1.7.0_17に変更します
Javaは自分でインストールする必要がありますのでインストール後、eclipseにも追加してください


また右クリック→プロパティ→プロジェクト・ファセットでのJavaのバージョンを1.7に変更します

■pom.xml編集
以下をprojectタブの直下に記載します
pom.xmlはプロジェクトの直下に作成されています
<build>
    <finalName>test</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
                <server>localtomcat</server>
                <port>8080</port>
                <path>/test</path>
            </configuration>
        </plugin>
    </plugins>
</build>
projectタグの直下(dependenciesタグと同階層)の箇所に記載します
とりあえずここは記載するだけでOKです

■tomcat-users.xml編集
記載したらtomcatを起動します
tomcatの起動はeclipseからでなくても問題ありません
(念のため起動しているかどうかhttp://localhost:8080/などにアクセスしてみてください)

また今回は/manager/textというパスにアクセスできる必要があります
このパスはmanager-scriptというロールに該当するユーザが存在する必要があります(manager-guiではありません)
conf/tomcat-users.xmlに以下を記載してください
<tomcat-users>
<user name="tomcat" password="s3cret" roles="manager-script" />

/managerにもアクセスさせたい場合には以下のようにします
<user name="tomcat" password="s3cret" roles="manager-gui,manager-script" />

インストール時にも設定することができますが、忘れた場合は直接conf/tomcat-users.xmlを編集してしまいましょう
編集してtomcatを再起動してください
http://localhost:8080/manager/text
にアクセスして設定したパスワードでログインできるか確認します

■settings.xmlの編集
/manager/text用のユーザ名とパスワードをmavenに認識させるためにmavenの設定ファイルであるsettings.xmlに記載します
ファイルは~/.m2/settings.xmlにあると思います
なければ作成して以下を記載します
※既存のファイルがあればserversタグ以下の情報をコピペしてください
<?xml version="1.0" encoding="UTF-8"?>
<settings>
    <servers>
        <server>
            <id>localtomcat</id>
            <username>tomcat</username>
            <password>s3cret</password>
        </server>
    </servers>
</settings>

■デプロイ
プロジェクトを右クリックし実行→実行の構成からMavenビルド用の起動設定をします
右クリック新規で起動設定を作成し名前を入力します
基底ディレクトーはワークスペースの参照から作成したプロジェクトを参照します
そして、ゴールの欄に以下を記載します
tomcat7:deploy
これがポイントでtomcat:deployでも実行できるのですが、tomcat:deployだと/manager配下にリクエストするためにエラーとなります
おそらくtomcat7から/manager/textにアクセスしないとダメなようになったっぽいので、ちゃんとtomcat7:deployと明示してあげます
あとは特に設定するところはありません(JRE等も選択できますが、デフォルトはワークスペースに設定されているJREが適用になります)
設定が完了したら実行します

以下のようなログが出れば完了です
[INFO] tomcatManager status code:200, ReasonPhrase:OK
[INFO] OK - コンテキストパス /test でアプリケーションを配備しました
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.765s
[INFO] Finished at: Wed Jul 31 15:30:22 JST 2013
[INFO] Final Memory: 13M/221M
[INFO] ------------------------------------------------------------------------
http://localhost:8080/test にアクセスしてデプロイされていることを確認します
(maven-archetype-webapp のデフォルトのままだとHello Worldが表示されるだけだと思います)

というわけで以上となります。
今回苦戦したポイントは
  • Tomcat7用のmaven-tomcat-pluginの記載が必要だった
  • Tomcatが起動していないといけない
  • tomcat7:deployをゴールに設定しないといけない
  • コンソールが文字化けしたのでeclipse.iniに-Dfile.encoding=utf-8を追加した(余談)
でした
まだ、日本語の情報が少ないのも意外とmavenに取っつきにく原因の一つかもしれません

■参考サイト