JDKをインストールして実行環境を作る（前編）

＜ 目次 ＞
◆（導入）統合開発環境 Eclipse について
・Eclipseとは
・ビルド機能
・プラグイン機能

◆Open JDK 11のインストールと設定
・インストール
・環境変数とは
・環境変数PATH
・環境変数JAVA_HOME


##◆　（導入）統合開発環境 Eclipse について
・Eclipseとは
EclipseはIBMがJavaで開発したオープンソースの統合開発環境です。
統合開発環境（IDE）とはテキストエディタやコンパイラ、デバッガが1つにまとめられたアプリケーション開発用のソフトウェアです。
もともとシステム開発はテキストエディタでソースコードを書き、コマンドライン上でコンパイルし、リンカでリンク（後述します）し、デバッガでバグ取りをするというように、行う処理によってツールが分かれていました。
そのような中でプロジェクト管理や開発効率などの観点から、これらのソフトウェアとその他の支援ツールをまとめて統合開発環境として生まれ、利用されるようになりました。


####・ビルド機能
ちなみにEclipseではコンパイルという名前の機能がなく、「ビルド」という機能が存在します。
ビルドはソースコードにバグなど異常がないかを解析し、なければソースコードをマシンコードに翻訳し、翻訳された複数のプログラムを結合させて実行可能ファイルへと変換して組み立てるまでの一連の作業の流れを指します。

翻訳された複数のプログラムを結合させて実行可能ファイルを作成する処理をリンクと呼びます。
単一なソースコードのプログラムであればコンパイルだけで済みますが、多くのソースコードを使って構成されるような複雑なソフトウェアなどではコンパイルが終わっただけでは各プログラムが断片的で実行することができず、それらのコードをリンクして組み合わせるという作業が必要になります。
この処理を行うプログラムを前述した「リンカ」といい、リンク時のツールとして利用されていました。

「ソースコードにバグなど異常がないかを解析し、なければソースコードをマシンコードに翻訳」という部分はコンパイルの部分で、「翻訳された複数のプログラムを結合させて実行可能ファイルへと変換して組み立てる」という部分がリンクの部分です。

まとめると、コンパイルからリンクまでの一連の処理がEclipseに備わっているビルドの機能です。


####・プラグイン機能
またEclipseは「プラグイン」と呼ばれる拡張モジュールを追加することによって、様々な機能を追加することができるようになっています。
以下はEclipseにインストールされているソフトウェア一覧の一部です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667316/11ab744d-c7c8-6ff9-020e-cd15473f3e14.png)

また以下のEclipse マーケットプレイスから拡張モジュールを追加することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667316/73a56407-4c38-aaa1-1595-72ed0cfa9fc9.png)

主なプラグインの一つが「Tomcatプラグイン」です。（以下関連用語が多く読みづらいかもしれません、、）
TomcatとはJavaサーブレットやJSPの実行環境となる、「サーブレットコンテナ」と呼ばれるオープンソースのサーバソフトウェアです。
Javaサーブレット（以下サーブレットと表記します）とはWebサーバ上で動き、「動的な」Webページの生成やデータ処理を行うプログラムです。
「動的」とは、例えばネットバンキングの残高やネットショッピングのカートなど、ブラウザからのリクエスト（個人情報や検索ワードの入力など）に応じて表示を変化させる、というようなことを指します。対して「静的」はリクエストに対して変化することなくサーバに用意されたコンテンツを返す、というようなことを指します。

JSPはサーブレットと同じくWebサーバ上で動作するプログラムで、HTML内にJavaコードを埋め込んで動的にWebページを生成します。

これらは単体では実行できず、実行環境としてサーブレットコンテナが必要になります。
Tomcatは簡易的なWebサーバの機能を持ったサーブレットコンテナのため、単体でWebサーバ、APサーバの機能として使用が可能です。
またApache HTTP Serverなどの他のWebサーバソフトと連携することもできます。（複雑な処理を行う場合はTomcatの簡易的なWebサーバ機能でなく外部のWebサーバソフトを利用するようです、というかこの場合が多いのではと思います）

このTomcatとEclipseを連携できるようにするプラグインがTomcatプラグインです。

記事の本題ではないのに大分長くなってしまいましたが、ここまでがEclipseについての説明です。
以降はEclipseではなく、JDKをインストールして実行環境を作っていきます。


##◆　Open JDK 11のインストールと設定
#####・インストール
インストールは以下から行います。
http://jdk.java.net/
[image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667316/c3a189a2-fe9f-6f68-27a7-051becf5ea45.png)

インストール後は環境変数の「PATH」と「JAVA_HOME」の設定を行います。

####・環境変数とは
>環境変数（かんきょうへんすう、英語: environment variable）はオペレーティングシステム (OS) が提供するデータ共有機能の一つ。OS上で動作するタスク（プロセス）がデータを共有するための仕組みである。特にタスクに対して外部からデータを与え、タスクの挙動・設定を変更するために用いる。
出典：Wikipedia 
https://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0

嚙み砕いて言うと、OSが持っている情報を変数に入れて、様々なプログラムを実行する際に共有で使うことができる、というものです。プログラム側からすると、自由に参照できるOSの持ち物のようなものでしょうか。
Javaの変数同様、使いたいものを名前を付けた箱に格納して使うようなイメージです。

環境変数には「システム環境変数」と「ユーザ環境変数」があります。
システム環境変数はどのユーザであっても参照できる変数で、ユーザ環境変数はOSへログインしたユーザのみが参照できる（管理者権限が必要な）変数を指します。ユーザ1が作成した環境変数には、ユーザ2はアクセスできない、といった具合です。
システム環境変数とユーザ環境変数に同じ変数があった場合は、基本的にユーザ環境変数が優先して参照されます。（後述しますが、環境変数PATHは除きます）
コントロールパネル＞システムとセキュリティ＞システム＞システムの詳細設定＞環境変数から確認でき、それぞれ分けて表示されています。


####・環境変数 PATH
複数のディレクトリへのパスが登録されている環境変数です。
この環境変数PATHに実行ファイルのあるディレクトリまでのパスを登録することを「PATHを通す」といいます。（実行したいファイルを登録するのではなく、実行したいファイルのあるフォルダまでのパスを登録します）
PATHが通っているフォルダ配下のプログラムへは、コマンドプロンプトでカレントディレクトリがどこであろうとアクセスすることができます。

PATHが通っているフォルダのプログラムの中で、メモ帳の実行ファイルである「notepad.exe」を例に見てみましょう。
通常プログラムを実行する際にはルートディレクトリから実行したいファイルまでの絶対パスを指定する必要があります。
notepad.exeはC:\Windows\system32\notepad.exe [^1]というフルパスになりますので、通常このようなプログラムをコマンドプロンプトで実行する場合はこのフルパスで実行することで、OSが「Cドライブの、、windowsフォルダの、、System32フォルダの、、あ、notepad.exeあった、実行しよう」というように解釈して実行します。

しかしnotepad.exeはPATHが通っているフォルダにある、、前述した説明をなぞると、実行ファイルであるnotepad.exeがあるディレクトリ(System32)までのパスが環境変数PATHに登録されているため、実行時にわざわざ絶対パスを指定する必要がありません。コマンドプロンプトで「notepad.exe」とだけ入力、つまりプログラム名だけで実行することができます。

環境変数PATHに設定されている値を確認すると（コントロールパネルかコマンドプロンプトでEcho %Path%で実行すれば確認できます）、Cドライブ配下のWindowsフォルダや、上記のSystem32をはじめとしたパスが登録されていることが確認できます。

OS側から見てみましょう。フルパスでの実行は前述したような「Cドライブの、、」とう流れになりますが、プログラム名（notepad.exe）だけでの実行はどうなるでしょうか。
例えばPATHの中身が以下であったとすると、

・C:\Windows\system32
・C:\Windows
・C:\Windows\System32\Wbem

まず先頭のC:\Windows\system32の中にnotepad.exeがあるかを確認して、あれば開く。
なければ次のC:\Windowsの中にnotepad.exeがあるかを確認して、、、
というように続いていきます。

また前項で「システム環境変数とユーザ環境変数に同じ変数があった場合は、基本的にユーザ環境変数が優先して参照される」と記述しましたが、PATHに限ってはどんな時もシステム環境変数PATHとユーザ環境変数PATHを併せて参照されます。（システム環境変数＋ユーザ環境変数で参照されるため、同じ名前のPATHがあった場合はシステム環境変数のものが優先されます）

コマンドプロンプトでEcho %Path%と実行すると、システム環境変数に登録されているパスとユーザ環境変数に登録されているパスが連なって参照されていることが確認できます。

ちなみに上記でnotepad.exeというプログラム名だけで実行できる、と記載しましたが、拡張子なしの「notepad」だけでも実行することができます。
それは「環境変数PATHEXT」の役割によるものです。
PATHEXTの中身を見てみましょう。

.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

PATHの中身が；区切りでパスが連なっていたように、；区切りで拡張子が連なっています。
コマンドプロンプトで実行ファイルに拡張子が書かれていない場合、PATHEXTを参照して拡張子を補おうとするのです。
notepad.com、、、ない
notepad.exe、、、あ、あった、開きます。といった具合です。

後述しますが、Javaを実行する際に使われるJavaコマンドやJavacコマンドと呼ばれるものも、要はJava.exeやJavac.exeの実行ファイルを拡張子なしで（PATHEXTが補完して）実行しているものです。

以上が環境変数PATHの概要になります。設定方法については後述するJAVA_HOMEと併せて後編にて説明します。


####・環境変数 JAVA_HOME
JAVA_HOMEは他のアプリケーションがJavaを利用する際に参照するパスが設定された環境変数です。
EclipseやTomcatなどのJavaを使用するアプリケーションではJavaがインストールされている場所を把握していなくてはならず、その際にJAVA_HOMEを参照するようになっています。

Java周りでは以下3つのパターンで参照する環境変数が分かれています。JAVA_HOMEについて他の2パターンを交えて説明します。

######1．PATH
PATHについては前述しましたが、Javaにおいて参照される内容は「Java実行に必要なモジュールの存在するディレクトリ」です。
実行に必要なjava.exe( )や、java.c.exeなどがあるディレクトリ
これがあることによって、ソースファイルのおかれているディレクトリでjavaコマンドやjavacコマンドが実行できるようになります。

######2．CLASSPATH
「コンパイル後のclassファイルがあるディレクトリ」が設定されているのがCLASSPATHで、JVMがどの場所からclassファイルを読み込めばいいか、を指定するためのものです。
Javaコマンドでオプション（コマンド実行時にそのコマンドの動作条件を指定する文字列）で-classpath（または-cp）を使用するとclassファイルの場所を指定することができますが、環境変数CLASSPATHを指定しておくことによってこれらのオプションでわざわざパスを指定せずに（カレントディレクトリから）実行することができます。

######3．JAVA_HOME
上記の2つはJava実行時に参照される変数であったのに対し、JAVA_HOMEは（前述しましたが）他のアプリケーションがJavaを利用する際に参照する環境変数です。
JAVAがインストールされているディレクトリを指定する必要があり、
C:\java\jdk-16.0.2
のように指定されます。

以上が環境変数JAVA_HOMEの概要になります。

後編にて設定の方法について説明します。

参考文献
この記事は以下の情報を参考に執筆いたしました。
-長谷川裕行 「もう一度基礎からC言語」 ” コンパイラとリンカ ”
https://dev.grapecity.co.jp/support/powernews/column/clang/003/page01.htm
-ペコプラ ” ビルドとは？仕組みや流れを解説 ”(2021-02-04)
https://pecopla.net/web-column/build-system
-Tech Campブログ “ 統合開発環境（IDE）とは？プログラミング言語別におすすめ環境を紹介 ”(2021-05-28)
https://tech-camp.in/note/technology/43103/
-IT用語辞典 e-words ” Tomcat 【Apache Tomcat】 ”(2017-06-22)
https://e-words.jp/w/Tomcat.html
-発注ラウンジ ” サーブレット(Java Servlet)とは？【概要を5分で把握】 ”(2020-02-28)
https://hnavi.co.jp/knowledge/blog/java-servlet/
-神田ITSchool ” サーブレット/JSP ”
https://kanda-it-school-kensyu.com/java-jsp-servlet-contents/jjs_ch01/jjs_0103/
-Tech Academy マガジン ” 種類もいくつか紹介！サーブレットコンテナとは【初心者向け】 ”(2017-08-10)
https://techacademy.jp/magazine/17688
-Teratail:syncrock様のご質問 - ockeghem様のご回答 ” apacheとtomcatについて ”(2019-04-19)
https://teratail.com/questions/185273
-Qiita @jeyei様　” Windows環境変数の超基本を理解する為のアプローチ ”(2021-04-17)
https://qiita.com/jeyei/items/2c385e4e0488a5fa2591#%E5%AE%9F%E8%B7%B5%E3%81%BE%E3%81%A8%E3%82%81
-Qiita @sta様　” 「PATH を通す」の意味をできるだけわかりやすく説明する試み ”(2018-05-25)
https://qiita.com/sta/items/63e1048025d1830d12fd
-Let'sプログラミング　” PATHの設定及び環境変数JAVA_HOMEの設定 ”
https://www.javadrive.jp/start/install/index4.html
-Windows 疑問・トラブル即解決 | FAQ CENTER ” Javaにおける Path、CLASSPATH、JAVA_HOMEの違い ”(2020-01-29)
http://tooljp.com/windows/chigai/html/Java/JAVA-CLASSPATH-JAVAHOME-chigai.html
-Yahoo! Japan 知恵袋 
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1031456260
-@IT atmarkIT 前田俊行 ” クラスパス(class path）を正しく使う
　 ―Java VMのクラスファイル検索機構― ”(2001-05-12)
https://atmarkit.itmedia.co.jp/fjava/onepoint/java/jv_clpath.html


[^1]: 余談ですが、C:\Windows配下にもnotepad.exeというファイルがありました。https://atmarkit.itmedia.co.jp/ait/articles/1807/17/news012.html 　←こちらの記事によると「古いバージョンとの互換性によるもの」だそうですが、時間があるときに詳しく調べてみようと思います。