Help us understand the problem. What is going on with this article?

javaコマンド入門

第4章 コードを実行する

Javaアプリケーションの種類

javaコマンドによるアプリケーションの実行について説明する前に、
Javaのアプリケーションにはどういったものがあるのかを見ていきます。

以下、Javaアプリケーションの大まかな分類です。
説明もざっくりしているので、気になった方はご自身で調べてください。

  • コンソールアプリ
    PromptやTerminalなど、コンソールから対話方式で利用するアプリ。
  • デスクトップアプリ
    1端末内で完結しているアプリ。GUIと言われることもある。
  • Webアプリ
    Webサーバとクライアント間の通信により処理を行うアプリ。
  • Androidアプリ
    Android向けのデスクトップアプリ。(ものの例えです)
  • 組み込み系プログラム
    家電など、ハードウェアに直接組み込まれたプログラム。

javaコマンドでは主に、コンソールアプリやデスクトップアプリの実行を行います。

javaコマンドの概要

javaコマンドを実行すると、Javaアプリケーションが起動します。
javaツールはまずJREを起動し、コマンドで指定されたクラスをロードします。
ロードされたクラスのmainメソッドが呼び出されることにより、mainメソッド内で呼び出される
他のクラスを順次ロードしながら、アプリケーションが実行されていきます。

mainメソッドを持つクラスの指定方法には、
クラスを直接指定する方法と、JARファイルを指定する方法があります。

mainメソッドの規約

mainメソッドはpublicでstaticであること、引数にString型の配列を取ること、
戻り値を返さないことを満たしたメソッドである必要がある。

mainメソッド
    public static void main(String[] args) {
        // 何らかの処理
    }

javaコマンドの基本構成

# java [ options ] class [ argument ... ]
$ java HelloWorld "args1" "args2"

上記の例では、HelloWorldクラスのmainメソッドが呼び出され、mainメソッドの引数argsには
"args1"と"args2"が格納されたString型の配列が渡されます。

クラスファイルの実行

クラスファイルの実行には、完全指定のクラス名を指定する必要があります。
上記の例ではパッケージ構成を取っていなかったため、
パッケージを指定しなくても実行できましたが、パッケージ構成をとっている場合には
パッケージを指定した完全指定でクラス名を指定する必要があります。

# カレントディレクトリは/src
# /srcをパッケージルートとし、HelloWorldが/src/com/example/app直下にある場合
$ java com.example.app.HelloWorld

JARファイルの実行

JARファイルを指定する場合、JARファイルにアーカイブされたクラスファイルから
mainメソッドを持つ起動クラスを特定するため、マニフェストファイルのMain-Classヘッダを
設定する必要があります。ここら辺の詳細は、以下の記事がわかりやすかったです。

参照記事:JARファイル入門 @hiwm0126

JARファイルの起動には、JARファイルの配置先を指定します。(絶対パス、相対パスどちらも可)
また、起動クラスにJARファイルを指定する場合は-jarオプションを付与する必要があります。

# カレントディレクトリは/(ルート)
# /lib/jars/sample-app.jarを実行する
$ java -jar /lib/jars/sample-app.jar

javaコマンドのオプション

主要なオプション

  • -classpath(または-cp) <パス>
    ユーザクラスの検索先を指定する。
    複数選択時はセミコロン(Windows)、またはコロン(Unix)で区切る。
  • -jar <パス>
    起動クラスにJARファイルを指定する。パスにはJARファイルの配置先を指定する。
  • -version
    Javaのバージョン情報を表示する。
  • -D<プロパティ名>=<値>
    Javaのシステムプロパティを設定する。設定した値は以下のように取得できる。
$ java -Dsun.boot.class.path="/sample/path" SampleApp
SampleAppクラス
// 設定した値「/sample/path」が取得できる
System.getProperty("sun.boot.class.path");

アサーション系のオプション

Javaのアサーションの有効、無効を設定するオプションです。
アサーションは、デフォルトでは無効になっています。

  • -enableassertions(または-ea):<適用範囲>
    アサーションを有効にする。適用範囲の指定には、以下の種類がある。
    • <パッケージ名>...
      指定したパッケージとそのサブパッケージで有効になる。
    • ...
      カレントディレクトリのデフォルトパッケージ(無名パッケージ)で有効になる。
    • <クラス名>
      指定したクラスで有効になる。
    • 引数なし
      システムクラスを除く全てのクラスで有効になる。
  • -disableassertions(または-da):<有効範囲>
    アサーションを無効にする。適用範囲の指定は、-enableassertionsオプションと同じ。
  • -enablesystemassertions(または-esa)
    全てのシステムクラスのアサーションを有効にする。
  • -disablesystemassertions(または-dsa)
    全てのシステムクラスのアサーションを無効にする。

デバッグ系のオプション

  • -verbose:{keyword list}
    コンマで区切られたキーワードリストにより指定された情報を通知する。
    • class
      クラスがロードされるタイミングで、クラスに関する情報を表示する。
    • gc
      ガーベジコレクションが動くたびに起動を通知する。
    • jni
      ネイティブメソッドの使用、Java Native Interfaceアクティビティの情報を通知する。

HotSpot系のオプション

HotSpotとは、JVMに組み込まれている処理高速化のための技術の総称。
JITコンパイラ(実行時コンパイラ)の一種で、一定回数以上実行されたメソッドのみを
コンパイルするなど、処理最適化のための仕組みが用意されている。

HotSpotにはJava HotSpot Client VM(クライアント版)とJava HotSpot Server VM(サーバ版)の
2種類があり、それぞれ以下の特徴がある。

  • クライアント版
    コンパイル対象を重要なクラス、メソッドに絞り、高速なロードを重視する。
  • サーバ版
    全体的にコンパイルするのでロードは遅くなるが、最適化を重視する。

以下は、利用するHotSpotを指定するためのオプションです。

  • -client
    Java HotSpot Client VMを選択して起動する。
  • -server
    Java HotSpot Client VMを選択して起動する。

ネイティブエージェントライブラリ系のオプション

Javaには、Java以外でコーディングしたプログラムを利用する仕組みがあり、
Java Virtual Machine Tool Interface(JVMTI)を介してエージェント(JVMTIのクライアント)と
やり取りすることで利用が可能となる。
このエージェントが、Java以外の言語で実装された各種ツールである。

以下のオプションは、これらのネイティブエージェントライブラリを利用するためのオプションである。

  • -agentlib:<ライブラリ名>=<オプション>
    ネイティブエージェントライブラリを指定し、ロードする。
  • -agentpath:<ライブラリのフルパス>=<オプション>
    フルパスでネイティブエージェントライブラリを指定し、ロードする。

実行

それでは、サンプルコードを実行していきます。

サンプルコードでは、Nullもしくは空文字が渡されると"NG"を、
それ以外の場合は引数の文字列を返すメソッドの処理結果を3件出力しているので、
"NG"、"NG"、"Hello World!"の3行が出力されるはずです。

# カレントディレクトリは/java-sample/srcです
$ java -cp /java-sample/lib/commons-lang3-3.10.jar:/java-sample/src com.example.app.UseCommons
# 以下、出力結果です
NG
NG
Hello World!

メインページに戻る

maple_syrup
主にJavaを使用してWebアプリの開発に携わっています。
pure-system
大手生命保険会社各社をはじめ、自治体、大手企業など、日本を代表する企業様のIT化を推進・支援しています。
https://www.pure-system.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした