【社内勉強会】Javaの基礎～IDEを使わずに実行～(2017/07/06)




# 0.はじめに

------------------
## 対象者など

### 対象者
* 普段Javaを使っている人
* Java8から利用できるラムダ式を使ったことがない人

### 前提知識
 * 基本的なJavaの使い方

### 伝えたいこと
* コマンドでJavaを実行する方法
* ラムダ式

------------------
## 参考図書

![Java本格入門.jpg](https://qiita-image-store.s3.amazonaws.com/0/37903/2c757117-a9d6-dda6-318e-6c6052ea053f.jpeg)
[『Java本格入門
～モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで』技術評論社](http://gihyo.jp/book/2017/978-4-7741-8909-3)


------------------
## 目次

1. Javaの概要
2. IDEを使わずコマンドでJavaを実行






---------------
# 1. Javaの概要


---------------
## Javaの特長
1995年、Sun Microsystemより発表されたプログラミング言語

* オブジェクト指向を前提としている
* プラットフォーム非依存。
    - OSごとにプログラムを修正する必要がない。
    - Java仮想マシン(Java VM)がOSの依存部分を吸収
* 利用者が多い
    - 優れたライブラリ、ミドルウェアが多い
     
---------------
## Java仮想マシン(Java Virtual Machine: JVM)の図

![JVMのスライド.jpg](https://qiita-image-store.s3.amazonaws.com/0/37903/8f094865-b7c7-ab01-cd84-d287dbe9ab08.jpeg)

※ [SlideShare: Java Night Seminar for Java Begineers](https://www.slideshare.net/OracleMiddleJP/java-night-seminar-for-java-begineers)  引用

---------------
## Javaの3つのエディッション

* Java SE(Standard Edition)
    - Java VMや標準的なAPIなど。
* Java EE(Enterprise Edition)
    - サーバアプリケーションの開発に必要な機能(Webサービスなど)
* Java ME(Micro Edition)
    - 家電製品、携帯電話などの組み込み系
    
    
    
---------------
## Javaの環境

* JRE(Java Runtime Environment)
    - Javaアプリケーションの実行環境。
    - jarファイルやクラスファイルを実行できる。

* JDK(Java Development Kit)
    - Javaアプリケーションの開発環境。
    - コンパイラー、デバッガなどのツールが含まれている。
    
※「Java本格入門」P16-17参照


---------------
## Javaの概念図

![JREとJDK.PNG](https://qiita-image-store.s3.amazonaws.com/0/37903/43cc94e2-47e5-a208-061d-f51b5670325f.png)    

※ [Java Platform Standard Edition 8ドキュメント](https://docs.oracle.com/javase/jp/8/docs/) 引用

---------------
# 2. IDEを使わずコマンドでJavaを実行


---------------
## IDEを使わずにコマンドで試す目的

* IDEが行ってくれている内容を、理解する
    - IDEでできること、できないことを知る
    - IDEで適切な設定が行える
* IDEで発生したエラーを解決できるようになる

※個人的見解

---------------
## 事前準備

* 環境変数PATHに、JDKのbinフォルダを追加。
* java, javacコマンドが使えるようにする。


---------------
## [Try] コマンドでコンパイル＆実行

* javacコマンドでコンパイルすると、`sample\Hello.class`が生成される。

```bat
javac sample\Hello.java
```

```java:sample/Hello.java
package sample;
/** Print Hello World */
public class Hello {
	public static void main(String[] args) {
		System.out.println("Hello");
	}
}
```

* javaコマンドで実行する

```bat
java sample.Hello 
REM ⇒ "Hello"
```

---------------
## Javaクラスファイル

>Javaクラスファイルは、Java仮想マシン (JVM) 上で実行可能なJavaバイトコードを含む（.class拡張子付きの）ファイルである。

※ [Wikipedia: Javaクラスファイル](https://ja.wikipedia.org/wiki/Java%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB) 引用

### [Try] javapコマンドで逆アセンブル

```bat
javap -verbose sample\Hello
```

* [Javaのクラスファイルをjavapとバイナリエディタで読む
java](http://dev.classmethod.jp/server-side/java/classfile-reading/)
* [Oracle リファレンス javapコマンド](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/javap.html)


---------------
# 3. Javaの基本的な用語


---------------
## クラスパス

外部ライブラリを参照(jarファイルなど)するのに、設定する必要がある。

>クラス・パスは、Java Runtime Environment(JRE)がクラスおよびその他のリソース・ファイルを検索するパスです。

>クラス検索パス(クラス・パス)は、JDKツールを呼び出すときに-classpathオプションを付ける(推奨される方法)か、CLASSPATH環境変数を設定して設定できます。-classpathオプションが推奨されているのは、アプリケーションごとに個別に設定できるので、ほかのアプリケーションに影響を与えたり、ほかのアプリケーションからこの値が変更されたりすることがないためです。

※ [Oracleリファレンス クラス・パスの設定](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/classpath.html) 引用

---------------
## jarファイル
**J**ava **AR**chiveの略。

>jarコマンドは、ZIPおよびZLIBの圧縮形式に基づいた汎用のアーカイブおよび圧縮ツールです。ただし、jarコマンドの主な目的は、いくつかのJavaアプレットやアプリケーションを1個のアーカイブにパッケージ化することです。

[Oracleリファレンス jar](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/jar.html#BGBEJEEG)

[Try] jarファイルの拡張子を"zip"に変更して、zip展開できることを確認。
[Try] jarコマンドでjarファイルを展開。

```bat
REM -x: 展開, -v:詳細情報出力, -f:ファイル名指定
jar -xvf sample.jar
```

---------------
## [補足] マニフェストファイル
jarファイル中には、`META-INF/MANIFEST.MF`というマニフェストファイルがある。

```text
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: 1.5.0_22 (Sun Microsystems Inc.)
Built-By: hen
Build-Jdk: 1.5.0_22
Implementation-Title: Commons Lang
Implementation-Vendor: The Apache Software Foundation
Implementation-Vendor-Id: org.apache
Implementation-Version: 3.0

～以下省略～
```

※ [commons-lang3-3.0.jar](http://central.maven.org/maven2/org/apache/commons/commons-lang3/3.0/commons-lang3-3.0.jar) のマニフェストファイル

>マニフェストファイルには、バージョンや、jarファイルの作成に使用したツールが記述される。 

※[KAB-studio マニフェストファイル](http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000838.html)



---------------
## Javaコマンドのオプション

Javaオプションのカテゴリの一部。

* 標準オプション
    - Java仮想マシン(JVM)のすべての実装でサポートされる

* 非標準オプション
    - Java HotSpot仮想マシンに固有の汎用オプション。すべてのJVM実装でサポートされる保証はない
    - `-X`から始まる
    
* 拡張ランタイム・オプション
    - Java HotSpot仮想マシンの操作の特定の領域のチューニングに使用するための開発者用オプション
    - `-XX`から始まる
    - ブール-XXオプションはプラス記号で有効、マイナス記号で無効を表す。(`-XX:+OptionName` ,  `-XX:-OptionName`)
    

※ [Oracle リファレンス java](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/java.html) 参照


---------------
### 使ったことがあるJavaオプション


* `-Dproperty=value` ： システム・プロパティの値を設定
    - `-Duser.language=ja`, `-Duser.country=JP`など
    - Javaソースでは、`System.getProperty("user.language");` で値を取得できる
    - Tomcat Configure Managerでは、JVM引数で指定
    

* `-Xmxsize` ：メモリー割当てプールの最大サイズ(バイト単位)を指定
    -  `-Xmx1024m`：1024MBを指定
    

* `-XX:+UseGCLogFileRotation`：GCログのローテーションを有効にする


※ 参考サイト
[Java HotSpot VM Options](http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html)    



---------------
# 付録



--------------
## Java EE

* `javax.*`パッケージ(Java SEでもjavaxから始まるクラスもある)
*  Tomcatのライブラリにも含まれている(servlet-api.jarなど)

   

--------------
## Javaのバージョン
 
Javaコマンドのバージョンの確認方法。

 ```
 java -version
 ⇒ java version "1.8.0_131"
 ```

 >オラクルでは定期的に更新が利用可能になります。更新が発生すると、バージョン文字列に更新版のバージョン番号も含まれます。つまり、JDK 8 update 5（JDK 8u5）ではバージョン文字列は"1.8.0_5"になります。

※ [Java Platform, Standard Edition 8の名前とバージョン](http://www.oracle.com/technetwork/jp/java/javase/jdk8-naming-2157130-ja.html) 引用


--------------
## Javaの環境変数

Javaを使うアプリケーション(Tomcatなど)は、環境変数`JAVA_HOME`や`JAVA_OPTS`などを設定する場合がある。