プロジェクト

全般

プロフィール

Javaプログラミング HelloWorld(JDK 17)

JDK 17におけるHelloWorldプログラムの作成と実行までを記述します。

Windows OSでの HelloWorld

JDK 17を使ったコマンドライン環境で、CUIのHelloWorldを作成し実行します。

JDK 17のインストールと設定

Oracle JDK 17をダウンロードしインストールします。

Java Downloads - Oracle
上述URLを開き、[Windows]をクリックし、3種類のダウンロードファイルのいずれか(今回はx64 MSI Installer)をダウンロードします。

  • jdk-17_windows-x64_bin.msi

これを実行します。デフォルトでは、C:\Program Files\Java\jdk-17 にインストールされます。

(情報)Oracle JDK 17のライセンス

Oracle JDK 17は、新しいライセンス NFTC(No-Fee Terms and Conditions)で提供され、最短でも2024年9月までは無償で商用利用を含めて利用可能となっています。

2024年9月は、次のLTS版となる予定のJDK 21がリリースされる2023年9月から1年後の期限です。LTS版がJDK 21ではなく23となる場合は、さらに1年後となります。

NFTCライセンスの期限以降も引き続きOracle JDK 17を商用で利用する場合は、有償のライセンス(Java SE Subscription等)または条件が合えば無償のOTNライセンスとなります。

コマンドライン環境の設定

コマンドプロンプトを開き、環境変数PATHに、<Oracle JDK 17をインストールしたディレクトリ>\bin を追加します。
javacコマンドを実行しバージョン番号が表示されれば確認OKです。

C:\> PATH=%PATH%;"C:\Program Files\Java\jdk-17\bin" 
C:\> javac --version
javac 17
C:\>
  • 注1. 環境変数PATHを設定します。よく環境変数JAVA_HOMEを設定せよと記述した記事を見かけますが、JDKのツールを使う限りは不要です。
  • 注2. よくシステムの環境変数PATHにJDKのパスを設定せよと記述した記事を見かけますが、プログラマーなら複数のJDKを使い分けることが必要なので、コマンドプロンプト毎に切り替えられるように都度設定した方がよいです。頻繁に使う場合はバッチファイル等で設定するとよいでしょう。

ディレクトリの作成

HelloWorldプログラムの開発ディレクトリを作成します。開発ディレクトリトップを作成し、その下にソースファイルを格納するディレクトリと、ビルド結果のモジュールを格納するディレクトリを用意します。

開発ディレクトリトップ
  +-- mods    ビルド結果のモジュール格納用トップ
  +-- src     ソース格納用トップ
  • mods はmodulesの略語で、Oracleのチュートリアル等の資料でよく使われている命名です。
  • src はsource(s)の略語で、Javaに限らずソースファイルを格納するディレクトリ(トップ)でよく使われています。
D:\work> mkdir hello
D:\work> cd hello
D:\work\hello> mkdir mods src
D:\work\hello> dir /w /b
mods
src
D:\work\hello> 

モジュール名とパッケージ名を決める

JDK 9から導入されたモジュールシステム(Java Platform Module System)は、従来のクラスパスに置き換わる依存関係、可視性のメカニズムです。
モジュール名とパッケージ名を本サンプルでは次のように命名します。

モジュール名 com.torutk.hello
パッケージ名 com.torutk.hello.app
  • Javaでは、一般にパッケージ名の命名は開発組織のドメイン名を逆順にした名称にモジュールの意味にちなんだ名称を付けて生成し、一意性を確保します。これにより、複数のライブラリ等を混在して開発した場合にパッケージ名が衝突することを避けます。
  • モジュール名は、モジュールに含むパッケージの中で代表となるパッケージ名とすることが推奨されています。

モジュール名のディレクトリをsrc直下に作る

モジュール名 com.tourtk.hello と同じ名のディレクトリをソース格納用ディレクトリトップの下に作成します。

D:\work\hello
     +-- src
           +-- com.torutk.hello

上述のディレクトリをコマンドラインで作成します。

D:\work\hello> mkdir src\com.tourtk.hello

D:\work\hello> dir /w /b src
com.torutk.hello
D:\work\hello> 

モジュール名と同じ名前のディレクトリを設けるのは、javacのコマンドラインオプション--module-source-pathを使うときの条件となります。
このオプションは、javacコマンドを1回実行するときに複数のモジュールをビルドする、いわゆるマルチモジュールのコンパイルで使用します。

モジュールソースディレクトリの下にパッケージ名に対応するディレクトリツリーを作る

モジュールソースディレクトリの下に、パッケージ名 com.torutk.hello.app に対応するディレクトリツリーを作成します。パッケージ名がピリオド区切りになっている場合は、ピリオド毎にサブディレクトリを作ります。

D:\work\hello
     +-- src
           +-- com.torutk.hello
                 +-- com
                       +-- torutk
                             +-- hello
                                   +-- app
D:\work\hello> cd src\com.tourtk.hello

上述のディレクトリツリーをコマンドラインで作成します。

D:\work\hello\src\com.tourtk.hello> mkdir com\torutk\hello\app

D:\work\hello\src\com.tourtk.hello> 

モジュール定義ファイルを作る

アプリケーションのソースディレクトリの直下に module-info.java ファイルを作成し、モジュール定義を記述します。

D:\work\hello
   +-- src
         +-- com.torutk.hello
               +-- com
               +-- module-info.java
  • module-info.java
    module com.torutk.hello {
    }
    

単独のモジュールで外部に公開するAPIもなく、暗黙で利用可能なjava.baseモジュール以外に依存するモジュールもないので、モジュール名の定義以外は空の記述となります。

HelloWorldのソースファイルを作る

D:\work\hello
   +-- src
         +-- com.torutk.hello
               +-- com
               |     +-- torutk
               |           +-- hello
               |                 +-- app
               |                       +-- Hello.java
               +-- module-info.java
  • Hello.java
    package com.torutk.hello.app;
    
    public class Hello {
    
        public static void main(String[] args) {
            System.out.println("Hello, World!");
        }
    }
    

コンパイル

D:\work\hello> javac -d mods --module-source-path src --module com.torutk.hello

D:\work\hello> tree /f mods
D:\WORK\HELLO\MODS
└─com.torutk.hello
    │  module-info.class
    │
    └─com
        └─torutk
            └─hello
                └─app
                        Hello.class

javac のオプションに次を指定します。

  • -d mods
    コンパイル結果の出力先ディレクトリを指定
  • --module-source-path src
    モジュールを構成するソースファイルの格納場所を指定。ここで指定した場所の下に、モジュール定義ファイルで指定したモジュール名と同じディレクトリが用意されていることが前提
  • --module com.torutk.hello
    コンパイル対象となるモジュールを指定。上述のモジュールソースファイルの中から、ここで指定したモジュール名のソースファイルをコンパイルし、さらに依存関係のあるモジュールでソースファイルからコンパイルする必要のあるものをコンパイル

コンパイルした結果を実行する

D:\work\hello> java --module-path mods --module com.torutk.hello/com.torutk.hello.app.Hello
Hello, World!
  • --module-path mods
    モジュールのビルドされたクラスファイルが展開される場所、またはモジュールJARファイルの配置場所を指定
  • --module com.torutk.hello/com.torutk.hello.app.Hello
    実行するモジュール名とメインクラス名をスラッシュ区切りで指定

モジュールJARを作る

モジュールJARファイルを作成します。

D:\work\hello> jar --create --file jars\com.torutk.hello.jar ^
 --main-class com.torutk.hello.app.Hello ^
 -C mods\com.torutk.hello .

D:\work\hello> dir /b /w jars
com.torutk.hello.jar

D:\work\hello>