サーチ…


構文

  • java [ <opt> ... ] <class-name> [ <argument> ... ]

  • java [ <opt> ... ] -jar <jar-file-pathname> [ <argument> ... ]

備考

javaコマンドは、コマンドラインからJavaアプリケーションを実行するために使用されます。 Java SE JREまたはJDKの一部として使用できます。

Windowsシステムでは、 javaコマンドに2つのバリエーションがあります。

  • java亜種は、新しいコンソールウィンドウでアプリケーションを起動します。
  • javawバリアントは、新しいコンソールウィンドウを作成せずにアプリケーションを起動します。

他のシステム(Linux、Mac OSX、UNIXなど)では、 javaコマンドだけが提供され、新しいコンソールウィンドウは起動しません。

構文内の<opt>記号は、 javaコマンド行のオプションを示します。最も一般的に使用されるオプションには、「Javaオプション」と「ヒープとスタックサイズのオプション」のトピックがあります。その他の情報については、 JVM Flagsトピックを参照してください。

実行可能なJARファイルの実行

実行可能なJARファイルは、Javaコードを実行可能な単一のファイルにアセンブルする最も簡単な方法です。 *(編集注:JARファイルの作成は個別のトピックでカバーする必要があります)*

パス名<jar-path>を持つ実行可能なJARファイルがあると仮定すると、次のように実行できます。

java -jar <jar-path>

コマンドにコマンドライン引数が必要な場合は、 <jar-path>後に追加します。例えば:

java -jar <jar-path> arg1 arg2 arg3

javaコマンド行で追加のJVMオプションを指定する必要がある場合は、 -jarオプションのに移動する必要があります。 -jarを使用する場合、 -cp / -classpathオプションは無視されることに注意してください。アプリケーションのクラスパスは、JARファイルマニフェストによって決定されます。

「メイン」クラスを介したJavaアプリケーションの実行

アプリケーションが実行可能なJARとしてパッケージ化されていない場合は、 javaコマンドラインでエントリポイントクラスの名前を指定する必要があります。

HelloWorldクラスの実行

「HelloWorld」の例については、「 新しいJavaプログラムの作成 」を参照してください。これは、エントリポイントの要件を満たすHelloWorldという単一のクラスで構成されています。

(コンパイルされた) "HelloWorld.class"ファイルがカレントディレクトリにあると仮定すると、次のように起動することができます:

java HelloWorld

注意すべき重要な事項は次のとおりです。

  • ".class"ファイルまたは ".java"ファイルのパス名ではなく、クラスの名前を指定する必要があります。
  • クラスがパッケージ内で宣言されている場合(ほとんどのJavaクラスがそうであるように)、 javaコマンドに提供するクラス名は完全なクラス名でなければなりません。たとえば、 SomeClasscom.exampleパッケージで宣言されている場合、完全なクラス名はcom.example.SomeClassます。

クラスパスの指定

java -jarコマンド構文で使用している場合をjava -jarjavaコマンドはクラスパスを検索してロードするクラスを探します。 クラスパスを参照してください。上記のコマンドは、現在のディレクトリを含む(または含む)デフォルトのクラスパスに依存しています。 -cpオプションを使用して使用するクラスパスを指定することで、これをより明確にすることができます。

java -cp . HelloWorld

これは、現在のディレクトリ( "。"が参照しているもの)をクラスパス上の唯一のエントリにすることを意味します。

-cpは、 javaコマンドによって処理されるオプションです。 javaコマンドを対象とするすべてのオプションは、クラス名の前にある必要があります。クラスの後のものは、Javaアプリケーションのコマンドライン引数として扱われ、 mainメソッドに渡されるString[]でアプリケーションに渡されます。

-cpオプションを指定しないと、 javaCLASSPATH環境変数で指定されたクラスパスを使用します。その変数が設定されていないか空であれば、 javaはデフォルトのクラスパスとして "。"を使用します)。

エントリーポイントクラス

Javaのエントリポイントクラスには、次のシグネチャと修飾子を持つmainメソッドがあります。

public static void main(String[] args)

Sidenote:配列の仕組みのせいで、 (String args[])

javaコマンドが仮想マシンを起動すると、指定されたエントリポイントクラスがロードされ、 mainを検索しようとします。成功すると、コマンドラインからの引数がJava Stringオブジェクトに変換され、配列にアセンブルされます。場合はmain 、次のように呼び出され、配列はなりません nullとどんな含まれませんnullエントリを。

有効なエントリポイントクラスのメソッドでは、次の操作を行う必要があります。

  • main (大文字と小文字を区別)
  • publicstatic
  • void型を返す
  • 配列String[]を持つ単一の引数を持ちます。引数は存在しなければならず、引数は複数指定することはできません。
  • ジェネリック:型パラメータは許されません。
  • ジェネリックではない、トップレベル(ネストされていない、または内部ではない)の囲みクラス

クラスをpublicとして宣言するのはpublicが、これは厳密には必要ではありません。 Java 5以降では、 mainメソッドの引数型は文字列配列ではなくString varargsである可能性があります。 mainはオプションで例外をスローすることができ、そのパラメータの名前は何でもかまいませんが、通常はargsです。

JavaFXエントリーポイント

Java 8以降では、 javaコマンドを使用してJavaFXアプリケーションを直接起動することもできます。 JavaFXのは、に記載されてのJavaFXタグが、JavaFXのエントリ・ポイントは、以下を行う必要があります。

  • javafx.application.Application拡張する
  • publicabstractではない
  • ジェネリックでもネストでもない
  • 明示的または暗黙的なpublic引数なしのコンストラクタを持つ

'java'コマンドのトラブルシューティング

この例では、 'java'コマンドを使用する際の一般的なエラーについて説明します。

"コマンドが見つかりません"

次のようなエラーメッセージが表示された場合:

java: command not found

javaコマンドを実行しようとすると、シェルのコマンド検索パスにjavaコマンドがないことを意味します。原因は次のようなものです。

  • Java JREまたはJDKがまったくインストールされていないため、
  • シェル初期設定ファイルでPATH環境変数(正しく)を更新していないか、または
  • 現在のシェルに関連する初期化ファイルを「供給」していません。

実行する必要がある手順については、 「Javaのインストール」を参照してください。

"メインクラスを見つけることができませんでした"

このエラーメッセージは、指定したエントリポイントクラスを検索/ロードできなかった場合、 javaコマンドによって出力されます。一般的に言えば、これが起こり得る3つの大きな理由があります。

  • 存在しないエントリポイントクラスを指定しました。
  • クラスは存在しますが、クラスを正しく指定していません。
  • クラスが存在し、クラスパスを正しく指定しましたが、クラスパスが正しくないため、Javaが見つかりません。

問題を診断して解決する手順は次のとおりです。

  1. エントリポイントクラスの完全な名前を確認します。

    • クラスのソースコードがある場合、フルネームはパッケージ名と単純なクラス名で構成されます。 "Main"クラスが "com.example.myapp"パッケージで宣言されたインスタンスは、完全名が "com.example.myapp.Main"です。
    • コンパイルされたクラスファイルをお持ちの場合は、 javapを実行してクラス名を見つけることができます。
    • クラスファイルがディレクトリにある場合、ディレクトリ名から完全なクラス名を推論することができます。
    • クラスファイルがJARファイルまたはZIPファイルの場合、JARファイルまたはZIPファイルのファイルパスから完全なクラス名を推論できます。
  2. javaコマンドのエラーメッセージを見てください。このメッセージは、 javaが使用しようとしている完全なクラス名で終了する必要があります。

    • エントリポイントクラスの完全なクラス名と完全に一致することを確認してください。
    • ".java"または ".class"で終わるべきではありません。
    • スラッシュまたはJava識別子1で合法でない他の文字を含むべきではありません。
    • 名前のケーシングは完全なクラス名と正確に一致する必要があります。
  3. 正しいクラス名を使用している場合は、そのクラスが実際にクラスパス上にあることを確認してください。

手でクラスパスを確認しても問題が見つからない場合は、 -Xdiag-XshowSettingsオプションを追加できます。前者はロードされているすべてのクラスをリストし、後者はJVMの実効クラスパスを含む設定を出力します。

最後に、この問題のいくつかの不明確な原因があります。

  • 存在しないクラスを指定するMain-Class属性を持つ実行可能なJARファイル。
  • 不正なClass-Path属性を持つ実行可能なJARファイル。
  • クラス名の前に2つのオプションを混乱させた場合、 javaコマンドはクラス名の1つを解釈しようとします。
  • 誰かがJavaスタイルルールを無視して、大文字小文字だけが異なるパッケージまたはクラス識別子を使用し、ファイル名の大文字小文字を重要でないものとして扱うプラットフォームで実行している場合。
  • コード内またはコマンドライン上のクラス名にホモグリフに関する問題

"メインメソッドがクラス<name>に見つかりません"

この問題は、 javaコマンドが指名したクラスを見つけて読み込めるが、エントリポイントメソッドを見つけることができない場合に発生する。

説明には3つの可能性があります。

  • 実行可能なJARファイルを実行しようとすると、JARのマニフェストに、有効なエントリポイントクラスではないクラスを指定する不正な「Main-Class」属性があります。
  • あなたは、エントリポイントクラスではないクラスをjavaコマンドに伝えました。
  • エントリポイントクラスが正しくありません。詳細については、「 エントリポイントクラス」を参照してください。

その他のリソース


1 - Java 8以降では、 javaコマンドはファイル名の区切り文字( "/"または "")をピリオド( "。")にマップするのに役立ちます。ただし、この動作はマニュアルページには記載されていません。

2 - テキストエディタが通常のハイフンの代わりに "長いハイフン"を使用している書式設定されたドキュメントからコマンドをコピー&ペーストすると、本当にあいまいなケースです。

ライブラリ依存関係を持つJavaアプリケーションの実行

これは、 「メインクラス」「実行可能なJAR」の例の続きです。

典型的なJavaアプリケーションは、アプリケーション固有のコードと、実装した、またはサードパーティによって実装された、さまざまな再利用可能なライブラリコードで構成されています。後者は、一般にライブラリ依存と呼ばれ、通常はJARファイルとしてパッケージ化されています。

Javaは動的にバインドされた言語です。ライブラリ依存関係を持つJavaアプリケーションを実行する場合、JVMは必要に応じてクラスをロードできるように、依存関係がどこにあるかを知る必要があります。概して、これに対処するには2つの方法があります。

  • アプリケーションとその依存関係は、必要なすべてのクラスとリソースを含む単一のJARファイルに再パッケージ化できます。

  • JVMは、ランタイムクラスパスを介して依存するJARファイルをどこに見つけるかを伝えることができます。

実行可能なJARファイルの場合、実行時クラスパスは "Class-Path"マニフェスト属性によって指定されます。それ以外の場合は、 -cpオプションを使用するか、 CLASSPATH環境変数を使用して、実行時クラスパスを指定する必要があります(これについては、 jarコマンドの別のトピックで説明してください)

たとえば、エントリポイントクラスがcom.example.MyAppの "myApp.jar"ファイルにJavaアプリケーションがあるとします。アプリケーションがライブラリJARファイル "lib / library1.jar"と "lib / library2.jar"に依存しているとします。コマンドラインで次のようにjavaコマンドを使用してアプリケーションを起動できます。

$ # Alternative 1 (preferred)
$ java -cp myApp.jar:lib/library1.jar:lib/library2.jar com.example.MyApp

$ # Alternative 2
$ export CLASSPATH=myApp.jar:lib/library1.jar:lib/library2.jar
$ java com.example.MyApp

(Windowsでは、クラスパス区切り文字として:代わりに;を使用し; exportではなくsetを使用して(ローカル) CLASSPATH変数をsetます)。

Java開発者はそれに慣れていますが、「ユーザーフレンドリー」ではありません。したがって、ユーザーが知る必要のない詳細を隠すために、単純なシェルスクリプト(またはWindowsバッチファイル)を書くのが一般的な方法です。たとえば、次のシェルスクリプトを "myApp"というファイルに入れて実行可能にし、それをコマンド検索パス上のディレクトリに置くと、

#!/bin/bash
# The 'myApp' wrapper script

export DIR=/usr/libexec/myApp
export CLASSPATH=$DIR/myApp.jar:$DIR/lib/library1.jar:$DIR/lib/library2.jar
java com.example.MyApp

次のように実行することができます:

$ myApp arg1 arg2 ...

コマンドライン上の引数はすべて、 "$@"拡張を介してJavaアプリケーションに渡されます。 (シンタックスは異なりますが、Windowsバッチファイルと同様のことができます)。

引数内の空白およびその他の特殊文字

まず第一に、引数内のスペースを処理する問題は、実際にはJavaの問題ではありません。むしろ、Javaプログラムを実行するときに使用しているコマンドシェルによって処理される必要がある問題です。

たとえば、ファイルのサイズを出力する次の簡単なプログラムがあるとします。

import java.io.File;

public class PrintFileSizes {
    
    public static void main(String[] args) {
        for (String name: args) {
            File file = new File(name);
            System.out.println("Size of '" + file + "' is " + file.size());
        }
    }
}

パス名にスペースが含まれているファイルのサイズを出力したいとします。例: /home/steve/Test File.txt 。次のようなコマンドを実行すると:

$ java PrintFileSizes /home/steve/Test File.txt

シェルは/home/steve/Test File.txtが実際には一つのパス名であることを知りません。代わりに、2つの異なる引数をJavaアプリケーションに渡します。これらの引数はそれぞれのファイルサイズを見つけようとし、それらのパスを持つファイルが存在しないために失敗します。

POSIXシェルを使用するソリューション

POSIXシェルにはshbashkshなどの派生物も含まれています。これらのシェルのいずれかを使用している場合は、引数を引用することで問題を解決できます。

$ java PrintFileSizes "/home/steve/Test File.txt"

パス名の前後の二重引用符は、単一の引数として渡されるべきであることをシェルに伝えます。この場合、引用符は削除されます。これを行うにはいくつかの方法があります:

$ java PrintFileSizes '/home/steve/Test File.txt'

一重引用符は二重引用符のように扱われますが、引数内のさまざまな拡張も抑制されます。

$ java PrintFileSizes /home/steve/Test\ File.txt

バックスラッシュは次のスペースをエスケープし、引数分離記号として解釈されないようにします。

引数の中の他の特殊文字を扱う方法の説明を含むより包括的なドキュメントについては、 Bashドキュメントの引用トピックを参照してください。

Windows用ソリューション

Windowsの基本的な問題は、OSレベルでは、引数が単一の文字列( ソース )として子プロセスに渡されることです。つまり、コマンドラインの解析(または再解析)の最終的な責任は、プログラムまたはランタイムライブラリのいずれかになります。不一致がたくさんあります。

Javaの場合、短いストーリーを短縮する:

  • javaコマンドの引数の前後に二重引用符を入れることができます。これにより、引数にスペースを入れて渡すことができます。

  • どうやら、 javaコマンド自体はコマンド文字列を解析しており、多かれ少なかれ正しい

  • しかし、これをバッチファイルでSETと変数置換の使用と組み合わせようとすると、二重引用符が削除されるかどうかは本当に複雑になります。

  • cmd.exeシェルには明らかに他のエスケープメカニズムがあります。二重引用符を二重にし、 ^エスケープを使うなどです。

詳細については、 バッチファイルのドキュメントを参照してください。

Javaオプション

javaコマンドは、幅広いオプションをサポートしています。

  • すべてのオプションは単一のハイフンまたはマイナス記号( - )で始まります。「長い」オプションに--を使用するGNU / Linuxの規約はサポートされていません。

  • オプションを認識させるには、 <classname>または-jar <jarfile>引数の前にオプションを指定する必要があります。その後の引数は、実行中のJavaアプリケーションに渡す引数として扱われます。

  • -Xまたは-XX始まらないオプションは標準オプションです。あなたは、任意の標準オプションをサポートするために、すべてのJava実装1に依存することができます。

  • -Xで始まるオプションは非標準オプションであり、あるJavaバージョンから次のJavaバージョンへと引き出される可能性があります。

  • -XXで始まるオプションは、高度なオプションであり、取り消すこともできます。

-Dシステムプロパティの設定

-D<property>=<value>オプションを使用して、システムPropertiesオブジェクトのプロパティを設定します。このパラメータは、異なるプロパティを設定するために繰り返すことができます。

メモリ、スタック、およびガベージコレクタオプション

ヒープとスタックのサイズを制御するための主なオプションは、ヒープ、PermGen、およびスタックのサイズの設定で説明されています。 (編集注:ガベージコレクタのオプションは同じトピックで説明する必要があります)

アサーションの有効化と無効化

-eaオプションと-daオプションはそれぞれ、Java assertチェックを有効または無効にします。

  • すべてのアサーションチェックはデフォルトで無効になっています。
  • -eaオプションを使用すると、すべてのアサーションをチェックでき-ea
  • -ea:<packagename>...は、パッケージおよびすべてのサブパッケージ内のアサーションのチェックを可能にします
  • -ea:<classname>...内のアサーションのチェックを有効にします。
  • -daオプションは、すべてのアサーションのチェックを無効にします。
  • -da:<packagename>...は、パッケージおよびすべてのサブパッケージ内のアサーションのチェックを無効にします
  • -da:<classname>...内のアサーションのチェックを無効にします。
  • -esaオプションを使用すると、すべてのシステムクラスをチェックできます。
  • -dsaオプションは、すべてのシステムクラスの検査を無効にします。

オプションは組み合わせることができます。例えば。

$ # Enable all assertion checking in non-system classes 
$ java -ea -dsa MyApp

$ # Enable assertions for all classes in a package except for one.
$ java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat MyApp

アサーションチェックを有効にすると、Javaプログラミングの動作が変更される可能性があることに注意してください。

  • 一般的にアプリケーションをより遅くする責任があります。
  • 特定のメソッドの実行に時間がかかり、マルチスレッドアプリケーションのスレッドのタイミングが変わる可能性があります。
  • それは記憶異常を消滅させる可能性のある予期せぬ出来事 - 先行関係を導入する可能性がある。
  • 誤って実装されたassertステートメントは、望ましくない副作用を持つ可能性があります。

VMタイプの選択

-clientオプションと-serverオプションを使用すると、2つの異なる形式のHotSpot VMを選択できます。

  • 「クライアント」フォームは、ユーザーアプリケーション用に調整されており、より高速な起動を提供します。
  • 「サーバー」フォームは、長時間実行されるアプリケーション用に調整されています。 JVMが「ウォームアップ」中に統計をキャプチャするのに時間がかかり、JITコンパイラはネイティブコードの最適化作業をよりうまく行えます。

デフォルトでは、JVMは、プラットフォームの機能に応じて、可能であれば64ビットモードで実行されます。 -d32および-d64オプションを使用すると、モードを明示的に選択できます。


1 - javaコマンドの公式マニュアルを確認してください。場合によっては、 標準オプションが「変更対象」として記述されることもあります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow