Java アプリの メイン・マニフェスト属性 を jar に与える

メイン・マニフェスト属性を jar ファイルに与えて java -jar XXX.jar で実行可能にする方法をメモします。

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>3.0.0</version>
				<configuration>
					<finalName>IgapyonApp</finalName>
					<descriptorRefs>
						<descriptorRef>jar-with-dependencies</descriptorRef>
					</descriptorRefs>
					<archive>
						<manifest>
							<mainClass>igapyon.app.App</mainClass>
						</manifest>
					</archive>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

初めての maven の Java プロジェクト

※このページの最新版は ここ を参照ください。

MavenJava プロジェクトを新規作成

cd workspace/
mvn archetype:generate -DgroupId=igapyon.app -DartifactId=IgapyonApp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

コマンドラインからの jar ファイル作成および実行

cd IgapyonApp/
mvn package
java -classpath target/IgapyonApp-1.0-SNAPSHOT.jar igapyon.app.App
Hello World!

Eclipse から Maven プロジェクトを開く

Eclipse neon.1 の場合は以下です。

  • [File | Import...]
  • Maven -> Existing Maven Projects

文字エンコーディングの記述

いずれ必要になる文字エンコーディングについて、 に以下を追加しておきます。

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

その他のよく使うコマンド

  • mvn compile
  • mvn test
  • mvn package
  • mvn install
  • mvn deploy
  • mvn clean

maven インストール

cd /tmp
tar xvzf apache-maven-3.3.9-bin.tar.gz 
sudo mkdir /opt/apache-maven-3.3.9
sudo mv /tmp/apache-maven-3.3.9/* /opt/apache-maven-3.3.9/

/etc/bash.bashrc

export MAVEN_HOME=/opt/apache-maven-3.3.9
export PATH=$PATH:$MAVEN_HOME/bin

動くドキュメントかつ自動テストとしての Geb スクリプト

Geb で動くドキュメントかつ自動テストな Geb スクリプトを作ってみようとトライしてみました。色々悶絶したので、それをメモしておきます。

※この日記エントリは Geb Advent Calendar 2016 に参加しています。

みなさん、ドキュメントを作成するの、好きですか?あるいは、テストコードをコーディングするの好きですか?それらは実コードのコーディングよりも重要で楽しいですか?
私は、できれば実コードの作成を優先し、ドキュメント作成やテストコード作成は低優先度で行きたい派です。
とはいえ、一般的に、あるいは経験的に、ドキュメント書いたりテスト書いたりしないとヒドイ事が起きるので、仕方なくドキュメント書いたりテスト書いたりしますですよね。

そこに Groovy 系列の Geb を使って解決しようとするのが今回の取り組みです。一般的に Groovy は Java コードよりも行数が少なくなるメリットがあるので、今回のようなテストコード作成には役立つことが期待できます。

ここから横道。読み飛ばしてOK。

なのですが、ところがですね、私は Groovy 習熟度が低かったので、色々ハマりました。
まず gradle 無しで 単純 groovy のみで、取り掛かってみようとしました。
すると、色々難易度上がります。
でも 最初の理解には 単体 groovy で、、、と頑張ったところ、色々ハマりました。奥が深いです。
さらに、途中で Ubuntu 16.04 に gradle インストールしようとして、それが引き寄せる groovy が入り、バージョン違いでナニガシ、、、
というように、真正面から色々ハマりました。
を一巡したところで、本文に戻ります。

ということで、まずは単純 Geb による「$」による要素アクセスのみを試して見ました。ドキュメント記述(そしてコンソール出力)には Ant タスクを利用しています。groovy から Ant タスクの echo を呼び出す、なんとも不思議な感触です。

@Grab('org.gebish:geb-core')
@Grab('org.seleniumhq.selenium:selenium-java')
@Grab('org.seleniumhq.selenium:selenium-chrome-driver')

import geb.Browser
import org.openqa.selenium.chrome.ChromeDriver

{->
  def home = System.properties['user.home']
  System.setProperty('webdriver.chrome.driver',
    "${home}/apps/selenium/chromedriver"
  )
}()

Browser.drive(driver:new ChromeDriver()) {
    def ant = new AntBuilder()

    ant.echo('サイトを開く')
    go 'http://www.yahoo.co.jp/'

    ant.echo('認証画面を開く')
    $("#siteinfo > li:nth-child(3) > a").click()

    ant.echo('トップ画面に戻る')
    $("#ygmhlog").click()
}

そして、これが可読性のあるテストコードとドキュメントの合成例です。
まずは最初の一歩ではありますが、まあ Java に比べると確かにこの時点で既にコード量は減っていますね。

bot 関連情報の収集

[Groovy] シンプル Groovy サンプル

Apache GroovyApache Foundation 配下にある言語及びコンパイラです。

まずは「apache-groovy-binary-2.4.7.zip」(この時点の最新安定板) をダウンロードします。そしてこれを展開します。
GROOVY_HOME を展開後ディレクトリに設定し、PATH に $GROOVY_HOME/bin を追加します。

例えば Ubuntu だと、以下のように .bashrc に2行追加することにより動くようになります。

.bashrc

GROOVY_HOME=/home/user1/apps/groovy
PATH=$PATH:$GROOVY_HOME/bin

対話形式による 初めての Groovy

次に、これを、まずはソースコードを作らずに対話形式による駆動を行ってみます。groovysh により、対話的に、素早く Groovy を動作させることができます。

bash から実行
$ groovysh
Groovy Shell (2.4.7, JVM: 1.8.0_102)
Type ':help' or ':h' for help.
-------------------------------------------------------------------------------
groovy:000> println "こんにちは世界!"
こんにちは世界!
===> null
groovy:000> 

非対話形式による Groovy の実行

これを、非対話型で動作させると以下させるには以下のようになります。

まずソースコードに相当するものを作成します。拡張子は .groovy です。

Hello.groovy
println "こんにちは世界!"

これを実行するには以下のようになります。

bash から実行
$ groovy Hello.groovy
こんにちは世界!

こんな感じで、初めての Groovy によるハローワールドは終わりです。

やたら Geb を勧められるので使ってみる

Selenium がらみでお知り合いになった @PoohSunny さんに やたら Geb を勧められました。GebGroovy 上で動く Web テスティングフレームワークなのだそうです。@PoohSunny さんの Geb のデモがやたらクールだったので、取り組んでみようと思いました。

※この日記エントリは Geb Advent Calendar 2016 に参加しています。

そういえば Groovy って、、、

そういえば かねてより (数年も前から) 私の一部の知人群で「熱狂的な」Groovy ファンが 私に Groovy を勧めていたので、腹をくくって(?)、関心を持ったのもあります。

まずは Groovy のインストール

まず GebGroovy ベースなので、先に Groovy インストールする必要があります。そのため、まずは Groovy を入門する必要があります。ということで、先に Groovy をインストールする手順を とっても簡単にメモしておきます。

ふむ。Java さへ入っていれば、こんな手順だけで簡単にインストールが終わるのって、不思議ですね。

ようやくここから Geb ハローワールド

さて、それでようやっと Geb を試そう、ということなので、「Groovy に Geb をインストールするんだよな。どうやるんだろう?」って不思議に思ったのですが、これが不思議、「@Grab」という構文に FQN を突っ込むと、実行時に maven リポジトリから自動的にダウンロードして .groovy/grapes にセットのうえ利用可能になるという超絶便利機能が Groovy に天然で備わっています。びっくり仰天です。これは便利だのう。
だから、以下のようにソースファイルを作成のうえ groovy で実行すると初回に自動的に必要ライブラリ一式をダウンロードした上で実行されます。ちなみに初回のダウンロード時間には注意が必要そうです(苦笑)

RunBrowser.groovy (ソースファイル)
@Grab('org.gebish:geb-core')
@Grab('org.seleniumhq.selenium:selenium-java')
@Grab('org.seleniumhq.selenium:selenium-chrome-driver')

import geb.Browser
import org.openqa.selenium.chrome.ChromeDriver

{->
  def home = System.properties['user.home']
  System.setProperty('webdriver.chrome.driver',
    "${home}/apps/selenium/chromedriver"
  )
}()

Browser.drive(driver:new ChromeDriver()) {
    go 'https://www.google.co.jp'
}

ソース的には、Selenium WebDriver 経由で Google Chrome を動作させる姿です。SeleniumChrome 用 WebDriver をダウンロード及び配置している必要があります。

コマンドライン (bash)
$ groovy RunBrowser.groovy 
Starting ChromeDriver 2.25.XXXXXX (XXXXXXXXXXXX) on port XXXXX
Only local connections are allowed.
12 18, 2016 10:30:53 午後 org.openqa.selenium.remote.ProtocolHandshake createSession
情報: Attempting bi-dialect session, assuming Postel's Law holds true on the remote end
12 18, 2016 10:30:56 午後 org.openqa.selenium.remote.ProtocolHandshake createSession
情報: Detected dialect: OSS
$ 
Google Chrome

これを実行中に Google Chrome が開いて Google サイトが表示されました。確かに Groovy ソースコードGeb 記述から Chrome をリモート操作できています。やったー。

まとめ

ということで、Geb が動作してめでたし、めでたし。でした、、、。しかし、このエントリー、ほとんど Groovy 入門になってしまいました。Geb で Groovy に関心を持った方のお役に立てば幸いです。