playで使うsbtについて。playで外部jarを追加する場合、eclipseなどでビルドパスを通してもいいんだけど、sbtというものがあるので使ってみる。内部はmavenらしい。

例として、mysqlとopencsvを追加。hogeProject/project/Build.scalaファイルを下のように修正。

・修正前
val appDependencies = Seq(
// Add your project dependencies here,
javaCore,
javaJdbc,
javaEbean
)

val appDependencies = Seq(
// Add your project dependencies here,
javaCore,
javaJdbc,
javaEbean,
"net.sf.opencsv" % "opencsv" % "2.3",
"mysql" % "mysql-connector-java" % "5.1.20"
)

キーワード「net.sf.opencsv」とか何を入力していいか解らない場合、MavenRepositoryの検索でopencsvと入力し、opencsvページのSBTタブを見ればわかる。「libraryDependencies += "net.sf.opencsv" % "opencsv" % "2.3"」。これを見たら、maven,sbtの他にもIvy,Grapeとかいろいろあるもんだ。

ref:sbt公式

これで問題なく外部jarが使えるようになるんだけど、eclipseで開発している場合は「play eclipse」を一度実行してあげないとコンパイルエラーがでる。

refs
play依存性の解決
ライブラリ依存性の管理(公式)

■バージョンアップ
2.1.1から2.1.5へ。まず2.1.5を落として解凍して2.1.5のplayの実行ファイルにクラスパスを通す。2.1.1で作ったプロジェクトのhogePrj/project/plugins.sbtを下のように編集する。

// 変更前
// Use the Play sbt plugin for Play projects
addSbtPlugin("play" % "sbt-plugin" % "2.1.1")
// 変更後
// Use the Play sbt plugin for Play projects
addSbtPlugin("play" % "sbt-plugin" % "2.1.5")

あとは、play clean、play compile、play runすればおっけ。マイナーバージョンをアップした時はhogePrj/project/build.propertiesのsbt.versionもバージョンアップしなければいけないみたいだけど、今回はマイナーバージョンは同じ2.1だから必要なし。

refs
play 2.1 migration guide(公式)
[Play!Framework] アップデートしてみました。2.1.1 -> 2.1.5

■2.1.1から2.2.0へ
この勢いで2.2へバージョンアップにトライ。plugins.sbtは「addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.0")」、build.propertiesは「sbt.version=0.13.0」へ変更。これでplay clean,play compileしたらコンパイルエラーでまくり。playの公式の2.2migration guideでcache moduleの依存性に書いてあったから試してみたけど、他にもコンパイルエラーがでる。

refs
play 2.2 migration guid (公式)
Play 2.2.0 is released! (mars hut)

akkaとかF.promiss?とかもある、他にもある、こりゃだめだ・・・

ref
OUR MIGRATION TO SBT 0.13.0 FOR PLAY AND AKKA
As Play 2.2 was released this week, we started our migration. At the same point we moved our sbt to 0.13.

同じマシンにjenkins、CollabNet Subversion Edge、Trac Lighintingをインストールしたら、カオスになってきたので(特にバンドルされているapache)メモ書き。

環境:os:windows7,64bit

・まず、jenkinsをインストール。
・続いて、jenkinsでsubversionを使うためにCollabNet Subversion Edgeをインストール。
⇒自サイト:CollabNet Subversion Edgeインストール,jenkinsとの連携

で、collabNetSubersionをインストールしたら、ウェブサーバとしてapacheがバンドルされる。windowsのサービスとしてインストールもされている。サービス一覧を見るには、msconfig⇒ツールタブのコンピュータの管理⇒サービスとアプリケーションのサービスで見れる。CollabNet Subversion EdgeとCollabNet Subversion Serverが追加されている。Serverの方がapacheでapache/2.4.6(win64)/SVN1.8.3。

続いてtrac lighintingをインストール。公式からTracLightning-3.2.0.exeをダウンロードして実行。javaあじゃいるインストール(Trac+SVN+Maven+Jenkins)でインストール。この時点で嫌な予感がしていた。trac lightingもapacheを内蔵している。

インストールが完了し、全てのプログラム⇒trac⇒コマンドプロンプトから実行をして、http://localhostにアクセスしたらcollabnetのit works、http://localhost/tracにアクセスしてもだめ。そりゃそう。collbaNetのapacheが起動していて、tracのapacheは起動していないわけだから。両方を同時に起動するにはでふぉじゃ無理、おそらくポート変更の必要があり。tracのapache起動するためにcollabNetのapacheを停止。そして、すべてのプログラム⇒trac⇒サービスのインストールでtracのapacheをサービスにインストール。サービス一覧を見ると、TracLighting(Apache/2.2.21 (Win32) DAV/2 SVN/1.6.17 mod_wsgi/3.3 Python/2.6.6)とTracLighting(Jenkins)がある。(Tracの方が色々と古い)前者の方のサービスを起動。これで、http://localhost/にアクセスしたら、ようこそTracLighingの世界へページ、http://localhost/tracへアクセスしたら、SampleProjectページへのリンクページが表示された。

apacheのログインID/passは両方とも、admin/admin。

apache,jenkins,subversionあたりが被ったくさい。

おすすめ本

〔改訂〕Trac入門 ~ソフトウェア開発・プロジェクト管理活用ガイド (Software De.../技術評論社
¥3,360
Amazon.co.jp

Jenkins実践入門 ~ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS.../技術評論社
¥2,919
Amazon.co.jp


javaビルドツールのantのメモ書き。

■jar,build.xml生成~antコマンド実行
eclipseのjavaプロジェクトでエクスポート⇒実行可能jarを選択(この際、外部jarを生成されるjarにパッケージにチェック、antスクリプトとして保管にチェックを入れる)。これで、実行可能jarとantのbuild.xmlファイル、それにbuild.xml実行時に必要なjar-in-jar-loader.zipファイルが出力される 。これで、build.xmlファイルがあるディレクトリでコマンドラインからもantコマンドを実行すれば、jarファイルが生成できるようになる。jar-in-jar-loader.zipファイルはなんとかならんかな…

■外部jarを外だしディレクトリに。
上のjar生成方法だとjar-in-jar-loader.zipファイルができた。また、外部jarファイルは生成jarファイルの中に入っていた。外部jarを外だしの別ディレクトリにするbuild.xml、そしてjarファイルを生成したい場合は、実行可能なjarを生成する際に、ライブラリ処理で生成されるjarの隣のサブフォルダーに必須ライブラリをコピーにチェックを入れればおっけ。でふぉだと「プロジェクト名_lib」というディレクトリになってしまうので、このディレクトリ名を変更したい場合はbuild.xmlファイルを編集すればいい。とりあえず、このbuildファイルを弄れば、ディレクトリ構成とかファイル名とかは変更できる。ただ、bin以下のclassファイルをjarに固めているから、ソースからコンパイルしてjarを生成するjavacタグを使ったcompileタスクが必要。それさえできればおっけ。

■javacタグでcompileタスク
eclipseで生成したbuild.xmlのタスク「create_run_jar」を見ると、すでにクラスファイルがあるbinディレクトリをjarに固めている。ソースからコンパイルしてbinディレクトリを作成するタスクも欲しい。下にそのタスクcompileを書く。


<property name="src" location="C:/java/testant/src" />
<property name="classes" location="C:/java/testant/bin" />

<property name="compile.lib.classpath" value="C:/java/testant/lib" />

<path id="compile.classpath">
<fileset dir="${compile.lib.classpath}">
<include name="*.jar" />
</fileset>
</path>

<target name="compile">
<delete dir="${classes}"/>
<mkdir dir="${classes}" />
<javac srcdir="${src}" destdir="${classes}" source="1.7" encoding="UTF-8">
<classpath refid="compile.classpath" />
</javac>
<copy preservelastmodified="true" file="${src}/jdbc.properties" tofile="${classes}/jdbc.properties" />
<copy todir="${classes}" >
<fileset dir="${src}">
<include name="**/*.sql" />
</fileset>
</copy>
</target>

外部jarのディレクトリはpathタグで書いておき、javacタグ内のclasspathタグで指定する。javacタグだけだと、*.javaファイルがコンパイルされて*.classファイルがbinディレクトリに生成されるだけ。上のサンプルでは、ソースディレクトリ内のjdbc.propertiesファイルと*.sqlファイルもbinディレクトリに移したかったので、copyコマンドもそれぞれ書いている。これで「ant compile」を実行すれば、C:/java/testant/binディレクトリにクラスファイル、jdbc.properteis、sqlファイルが生成される。この後にant create_run_jarを実行すれば、実行可能なjarが出来上がる。下はcreate_run_jarタスクのdependsにcompileを指定して、create_run_jarを実行した時に、事前にcompileタスクを実行するようにしていう。

<target name="create_run_jar" depends="compile">

javacコマンドのクラスパスオプションの指定
apache Ant(Hishidama)

■build.xml
eclipseでjavaプロジェクトを作って、そのプロジェクト用のbuild.xmlファイルが欲しいときはeclipseのエクスポートで一般⇒Antビルドファイルを選択する。そうすれば、build.xmlファイルの雛形がエクスポートされる。雛形と言っても、クリーン、ビルド、実行etcと結構なタスクがある。そのbuild.xmlファイルを下に書く。プロジェクト名はTestAnt、エントリクラスはjp.co.hoge1.MainEntry。jarを生成するタスクがなかったので、jarタスクは自分で追記した。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- WARNING: Eclipse auto-generated file.
Any modifications will be overwritten.
To include a user specific buildfile here, simply create one in the same
directory with the processing instruction <?eclipse.ant.import?>
as the first entry and export the buildfile again. -->
<project basedir="." default="build" name="TestAnt">
<property environment="env"/>
<property name="ECLIPSE_HOME" value="../../eclipse"/>
<property name="debuglevel" value="source,lines,vars"/>
<property name="target" value="1.7"/>
<property name="source" value="1.7"/>
<path id="TestAnt.classpath">
<pathelement location="bin"/>
<pathelement location="lib/commons-lang3-3.1.jar"/>
</path>
<target name="init">
<mkdir dir="bin"/>
<copy includeemptydirs="false" todir="bin">
<fileset dir="src">
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="clean">
<delete dir="bin"/>
</target>
<target depends="clean" name="cleanall"/>
<target depends="build-subprojects,build-project" name="build"/>
<target name="build-subprojects"/>
<target depends="init" name="build-project">
<echo message="${ant.project.name}: ${ant.file}"/>
<javac debug="true" debuglevel="${debuglevel}" destdir="bin" source="${source}" target="${target}">
<src path="src"/>
<classpath refid="TestAnt.classpath"/>
</javac>
</target>
<target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects"/>
<target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler">
<copy todir="${ant.library.dir}">
<fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
</copy>
<unzip dest="${ant.library.dir}">
<patternset includes="jdtCompilerAdapter.jar"/>
<fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
</unzip>
</target>
<target description="compile project with Eclipse compiler" name="build-eclipse-compiler">
<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
<antcall target="build"/>
</target>
<target name="MainEntry">
<java classname="jp.co.hoge1.MainEntry" failonerror="true" fork="yes">
<classpath refid="TestAnt.classpath"/>
</java>
</target>

<target name="jar" depends="build">
<jar destfile="jar/TestAnt.jar">
<manifest>
<attribute name="Main-Class" value="jp.co.hoge1.MainEntry"/>
<attribute name="Class-Path" value=". lib/commons-lang3-3.1.jar"/>
</manifest>
<fileset dir="bin"/>
</jar>

<delete dir="jar/lib"/>
<mkdir dir="jar/lib"/>
<copy file="lib/commons-lang3-3.1.jar" todir="jar/lib"/>
</target>

</project>


■build.xml(タスク)
wiki(Antタスク)

■よく使うコマンドオプション
ant -v
⇒-h。ヘルプ
⇒-vは-verboseの略。詳細メッセージあり。-versionとは別
⇒-d。-debug。詳細メッセージあり。

■jenkinsとの連携
jenkinsからantのbuild.xmlファイルを指定して実行することもできる。新規ジョブ作成でフリースタイルを選択。ビルドのビルド手順の追加でantの呼び出しを選択。使用するantとターゲット(空でもおっけ)を選択し、高度な設定のビルドファイルでbuild.xmlのパスを入力する。-debugとかのantのオプションをつけて実行したくて色々試してみたけどできなかった…

■参考
Apache Ant™ 1.9.2 Manual(公式英語)
ant1.6.1(日本語マニュアルもある)

javaのjarファイルについて

■自サイト
Mavenメモ2~eclipseプラグイン
Apache Mavenメモ

■参考
jarファイルの仕様(oracle,1.5だから古い)、manifestファイルとかも


■mavenで生成されたjarファイル
mavenで生成されたjarファイルの中をみると、クラスファイル以外では、pom.xml,pom.propertiesファイルがある。あと、META-INFディレクトリ下にMANIFEST.MFファイルがある。マニフェストファイルの中身はこんな感じ。

Manifest-Version: 1.0
Built-By: hogeuser
Build-Jdk: 1.7.0_21
Class-Path: lib/commons-lang3-3.0.jar lib/opencsv-2.3.jar
Created-By: Apache Maven 3.0.5
Main-Class: hoge1.hoge2.HogeEntry
Archiver-Version: Plexus Archiver

JDKのバージョン、エントリクラスや外部jarのクラスパス等の情報がある。

pom.propertiesはこんな感じ。
#Generated by Maven
#Fri Sep 27 10:43:59 JST 2013
version=0.0.1-SNAPSHOT
groupId=hoge1.hoge2
artifactId=HogePrj

pom.xmlファイルの必要最低限の情報ですね。

■生javaプロジェクトで作成した実行可能なjarファイル

eclipseで作ったjavaプロジェクトで実行可能なjarをエクスポートした場合もMETA-INFディレクトリ下にMANIFEST.MFファイルがある。中身はこんな感じ。外部jarも実行可能なjarの中に含んでいます。

Manifest-Version: 1.0
Rsrc-Class-Path: ./ commons-lang3-3.1.jar mysql-connector-java-5.1.20-
bin.jar opencsv-2.3.jar
Class-Path: .
Rsrc-Main-Class: batch.HogeEntry
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

mevenについてのメモ2

Apache Maven(自サイト)

■eclipseのmavenプラグインについて。
環境はos:windows7 64bit,eclipse:pleiades indigo(3.7)
all in oneのpleiadesなのにmavenのプラグインは入っていないのでそれを導入。ヘルプ⇒eclipseマーケットプレースでmavenかm2eで検索してMaven Integration for Eclipse WTP(juno)をインストールする。junoは4.2なんだけど・・・このインストールはマーケットプレースウインドウで完了を押してからも結構時間がかかる。インストールが完了したらeclipseの再起動を要求される。

再起動してmavenがインストールされていれば、新規⇒プロジェクトでmavenプロジェクトが作れるようになっているし、mavenプロジェクトがあってpom.xmlを右クリックして実行しようとするとmaven clean,install,ビルドとかが実行できるようになっている。あと、pom.xmlのdependencyで必要なライブラリを書けば、リアルタイムでそのjライブラリarファイルをmaven依存関係に導入してくれる。やはりこれ便利。実際にjarがあるディレクトリはデフォだとC:\Users\ユーザ名\.m2\repositoryディレクトリ以下

mavenプロジェクトをeclipseプロジェクトに変換前にインポートはできるけど、それでmainメソッドがあるクラスファイルを選択して実行してもエラーが発生する。「エラー: メイン・クラスHogeEntryが見つからなかったかロードできませんでした」しっかりeclipseように変換する必要がある。コマンドは「mvn eclipse:eclipse」。

eclipseからのインポートについて。mavenの「Existing Maven Projects」でできる。一般の既存プロジェクトからワークスペースへだと文字化けした。ただ、mavenプロジェクトに変換前にインポートして、その後にmavenプロジェクトへ変換すれば問題なかった。

バッチとかのただのmavenプロジェクトの場合、エントリポイントのmainメソッドがあるクラスを指定する必要があり、それはpom.xmlファイルのpluginタグの中のmainClassタグ。結構階層が深い。下に例を書く。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
<mainClass>hogepackage1.HogeEntry</mainClass>
</manifest>
</archive>
</configuration>
</plugin>

■mavenでよく使うコマンド
・mvn clean
⇒targetディレクトリを削除する
・mvn compile
⇒target\classesディレクトリを作成し、その下にクラスファイルを生成する
・mvn package
⇒mvn compileに加え、targetディレクトリ下にクラスファイルを纏めたjarファイルを生成してくれる。ただ、外部jarを使う場合(mavenを使うぐらいなら必ず外部jarを使っている)、その外部jarを取り込んでいたいので実行しようとするとエラーが出る。
また、jarファイルの中身一覧を見たい場合「jar tvf target\hoge1.0.jar」
・mvn install
⇒mvn packageに加え、target\libディレクトリを作成し、その下にpom.xmlで書いた外部jarと依存関係のあるjarをすべて取り込んでくれる。なので、java -jar hoge1.0.jarが実行できるようになる。
(mavne installでtestのコンパイル・実行をスキップしたい時は「mvn install -Dmaven.test.skip=true」、テストの実行だけをスキップしたい時は「mvn install -DskipTests=true」)

コマンドラインからの実行とeclipse上のpom.xmlファイルから実行する場合の結果は少し異なる。上で書いたことはコマンドラインから実行した場合。あと、mvn installで外部jarを取り込んだり実行可能なjarを生成したい場合に必要なプラグインが二つある。それをpom.xmlファイルに書く。


<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
<mainClass>hogepackage.HogeEntry</mainClass>
</manifest>
</archive>
</configuration>
</plugin>

ref : 今まで知らなかった 5 つの事項: Apache Maven.実行可能なjarファイル

■実行可能なjarを生成する
targetディレクトリ下の成果物のjarとlibディレクトリの外部jarを一緒にして実行可能なjarを生成したい場合、pom.xmlファイルのpluginsディレクトリに下のように書く。

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<!-- ここはこのままでOK -->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!-- ここにmain関数のあるクラスを指定。これがManifest.mfに設定されます -->
<mainClass>hogePackge.hogeEntry</mainClass>
</manifest>
</archive>

</configuration>
<executions>
<!-- ここでpackageのPhaseで実行されるように設定している-->
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- append to the packaging phase. -->
<goals>
<goal>single</goal> <!-- goals == mojos -->
</goals>
</execution>
</executions>

</plugin>

参考サイト:Mavenで、依存ライブラリのjarを含んだ実行可能なjarを生成する方法

これでmvn installを実行すると、targetディレクトリ下にhogeBatch1.0-jar-with-dependencies.jarを生成する。ただ、外部jarはhoge-1.0-jar-with-dependencies.jarの中にjarを展開してクラスファイル一覧にしている。これはうざい。うまくやれば、外部jarのままで成果物のjarの中に取り込んでくれると思うんだけど、今は緊急性を求められていないので放置している。

■pom.xmlのデフォルトプロパティ
・pom.xmlには${project.build.directory}のような組み込みのプロパティがいくつもある。
ref:pom.xmlファイルからプロパティ取得

■jenkinsからmavenを呼び出しjarを生成する
jenkinsの新規ジョブでMaven2/3プロジェクトのビルドを選択する。ビルドのpom.xmlで「C:\pleiades\maven\HogePrj\pom.xml」みたいな感じでpom.xmlファイルを指定する。ゴールとオプションは例えばinstallとか。これはコマンド「mvn install」と同じ。これで単純な設定は完了。ビルド実行し、正常に終了すれば、targetディレクトリ下にゴール成果物のjarファイルが生成される。jenkinsからはもっといろいろできる・・・

■eclipse上でエラー
mavenプロジェクトで実行できるし、mvnコマンドもできるんだけど、エラーアイコンが表示されることがある。マーカーびゅーの問題項目を見ると、「Project configuration is not up-to-date with pom.xml. Run Maven->Update Project or use Quick Fix」というメッセージ。解決方法は、プロジェクトを右クリック⇒maven⇒プロジェクトの更新(Alt+F5)。これで直るはず。

■ビルドサイクル
mavenにはビルドサイクルがある。dafault,clean,siteの3つ。defaultは、validate,compile,test,package,integration-test,verify,install,deploy。mvn installを実行した場合、validate~installが実行される。