shiba-hiro’s 備忘録

技術ブログの皮を被ったただの備忘録

空っぽのLinuxからJavaを動作させる & Mavenを動作させる

空っぽのOSから一歩を踏み出す

前回までのところで、ローカルで空っぽのUbuntuを用意することができました。
おそらく、評価環境や商用環境など成果物のデプロイ先は、AWSなどで空っぽのOSを立てることからのスタートです。
Java自体の復習をしたいという狙いもありますが、同時に、成果物を動作させていくのに必要な内容を掴んでいきたいと思います。
これ以降のコマンドは、基本、立ち上げたUbuntuで打っていくことを想定しています。

shiba-hiro.hatenablog.com

shiba-hiro.hatenablog.com

Javaを動作させる

Javaとは何ぞや的な詳細は、ほかのところに譲ります。
Sun Microsystemsがリリースしたオブジェクト指向プログラミング言語で、 JVMと呼ばれるJava仮想マシン上で動作します。
仮想マシンをかませるところには、 "write once, run anywhere"の思想が埋まっています。

ということで、早速セットアップを進めます。

$ sudo apt update
$ sudo apt install -y default-jdk

$ export JAVA_HOME=/usr/lib/jvm/default-java
$ export PATH=$PATH:$JAVA_HOME/bin

今回は実際にJavaのソースを仮想マシン上で用意してコンパイル、実行するところまでやりたいので、JDK(Java Development Kit)をインストールします。
実行環境だけ必要であれば、JRE(Java Runtime Environment)だけあれば十分です。
JREには先に述べたJVMが含まれます。

# 実行させたいだけならJREのみでOK
$ sudo apt install -y default-jre

なお、JDKにはJREも内包されているので、重ねてインストールコマンドを叩く必要はありません。
ここまでで、java -version, javac -versionといったコマンドでバージョン確認ができるようになっています。

$ java -version
java version "1.7.0_151"
OpenJDK Runtime Environment (IcedTea 2.6.11) (7u151-2.6.11-2ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.151-b01, mixed mode)

$ javac -version
javac 1.7.0_151

ではHello World してしまいましょう。

$ echo 'public class Hello{ public static void main(String[] args){ System.out.println("Hello World"); } } ' > Hello.java

$ javac Hello.java
$ java Hello 
Hello World

Javaファイルを作成して、コンパイルして、実行する、という流れですね。

引数をつけたければ次のように行いましょう。

$ echo 'public class WithArg{ public static void main(String[] args){ System.out.println("See it, " + args[0]); } }' > WithArg.java

$ javac WithArg.java
$ java WithArg this-is-argument
See it, this-is-argument

Mavenを使う

ビルドツールを利用するのが普通だと思っているので、mavenを利用したプロジェクト作成から実行もやってみます。
(厳密には、mavenはもっと大きな役割を包含したものですが、便宜上そう呼称します)

https://maven.apache.org/index.html

Apache Maven is a software project management and comprehension tool.

# インストール
$ sudo apt install -y maven 

$ mvn -version
Apache Maven 3.0.5
Maven home: /usr/share/maven
Java version: 1.7.0_151, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-7-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.13.0-141-generic", arch: "amd64", family: "unix"

# サンプルプロジェクトの作成
$ mvn archetype:generate \
>   -DarchetypeArtifactId=maven-archetype-quickstart \
>   -DinteractiveMode=false \
>   -DgroupId=com.sample \
>   -DartifactId=mvn-example

# 雛形の作成を確認
$ cd mvn-example/
$ ls -R
.:
pom.xml  src

./src:
main  test

./src/main:
java

./src/main/java:
com

./src/main/java/com:
sample

./src/main/java/com/sample:
App.java

./src/test:
java

./src/test/java:
com

./src/test/java/com:
sample

./src/test/java/com/sample:
AppTest.java

# コンパイル
$ mvn compile

# targetディレクトリ以下が作成されていることを確認
$ ls target/ -R
target/:
classes

target/classes:
com

target/classes/com:
sample

target/classes/com/sample:
App.class

# mavenで実行
$ mvn exec:java -Dexec.mainClass=com.sample.App
...
Hello World!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20.487s
[INFO] Finished at: Thu Feb 08 13:58:23 UTC 2018
[INFO] Final Memory: 8M/21M
[INFO] ------------------------------------------------------------------------


# もちろんjavaコマンドも利用可能
$ java -cp target/classes/ com.sample.App
Hello World!

雛形の作成から実行まで、スムーズに進められるようになりました。
おまけ的に、mvnコマンドに引数を設定する方法もメモしておきます。

# 引数を使うプログラムへ、App.javaを書き換え
$ echo 'package com.sample; public class App{ public static void main( String[] args ){ System.out.println("See it, " + args[0]); } }' > src/main/java/com/sample/App.java 

# 再度コンパイル、引数をつけて実行
$ mvn compile
$ mvn exec:java -Dexec.mainClass=com.sample.App -Dexec.args=mvn-sample-arg
...
See it, mvn-sample-arg
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.088s
[INFO] Finished at: Thu Feb 08 14:06:16 UTC 2018
[INFO] Final Memory: 7M/17M
[INFO] ------------------------------------------------------------------------

20180210追記;
Mavenについての説明記事を投稿しました。

shiba-hiro.hatenablog.com