Java Language
Javaコマンド - 'java'と 'javaw'
サーチ…
構文
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
コマンドに提供するクラス名は完全なクラス名でなければなりません。たとえば、SomeClass
がcom.example
パッケージで宣言されている場合、完全なクラス名はcom.example.SomeClass
ます。
クラスパスの指定
java -jar
コマンド構文で使用している場合をjava -jar
、 java
コマンドはクラスパスを検索してロードするクラスを探します。 クラスパスを参照してください。上記のコマンドは、現在のディレクトリを含む(または含む)デフォルトのクラスパスに依存しています。 -cp
オプションを使用して使用するクラスパスを指定することで、これをより明確にすることができます。
java -cp . HelloWorld
これは、現在のディレクトリ( "。"が参照しているもの)をクラスパス上の唯一のエントリにすることを意味します。
-cp
は、 java
コマンドによって処理されるオプションです。 java
コマンドを対象とするすべてのオプションは、クラス名の前にある必要があります。クラスの後のものは、Javaアプリケーションのコマンドライン引数として扱われ、 main
メソッドに渡されるString[]
でアプリケーションに渡されます。
( -cp
オプションを指定しないと、 java
はCLASSPATH
環境変数で指定されたクラスパスを使用します。その変数が設定されていないか空であれば、 java
はデフォルトのクラスパスとして "。"を使用します)。
エントリーポイントクラス
Javaのエントリポイントクラスには、次のシグネチャと修飾子を持つmain
メソッドがあります。
public static void main(String[] args)
Sidenote:配列の仕組みのせいで、
(String args[])
java
コマンドが仮想マシンを起動すると、指定されたエントリポイントクラスがロードされ、 main
を検索しようとします。成功すると、コマンドラインからの引数がJava String
オブジェクトに変換され、配列にアセンブルされます。場合はmain
、次のように呼び出され、配列はなりません null
とどんな含まれませんnull
エントリを。
有効なエントリポイントクラスのメソッドでは、次の操作を行う必要があります。
-
main
(大文字と小文字を区別) -
public
とstatic
-
void
型を返す - 配列
String[]
を持つ単一の引数を持ちます。引数は存在しなければならず、引数は複数指定することはできません。 - ジェネリック:型パラメータは許されません。
- ジェネリックではない、トップレベル(ネストされていない、または内部ではない)の囲みクラス
クラスをpublic
として宣言するのはpublic
が、これは厳密には必要ではありません。 Java 5以降では、 main
メソッドの引数型は文字列配列ではなくString
varargsである可能性があります。 main
はオプションで例外をスローすることができ、そのパラメータの名前は何でもかまいませんが、通常はargs
です。
JavaFXエントリーポイント
Java 8以降では、 java
コマンドを使用してJavaFXアプリケーションを直接起動することもできます。 JavaFXのは、に記載されてのJavaFXタグが、JavaFXのエントリ・ポイントは、以下を行う必要があります。
-
javafx.application.Application
拡張する -
public
しabstract
ではない - ジェネリックでもネストでもない
- 明示的または暗黙的な
public
引数なしのコンストラクタを持つ
'java'コマンドのトラブルシューティング
この例では、 'java'コマンドを使用する際の一般的なエラーについて説明します。
"コマンドが見つかりません"
次のようなエラーメッセージが表示された場合:
java: command not found
java
コマンドを実行しようとすると、シェルのコマンド検索パスにjava
コマンドがないことを意味します。原因は次のようなものです。
- Java JREまたはJDKがまったくインストールされていないため、
- シェル初期設定ファイルで
PATH
環境変数(正しく)を更新していないか、または - 現在のシェルに関連する初期化ファイルを「供給」していません。
実行する必要がある手順については、 「Javaのインストール」を参照してください。
"メインクラスを見つけることができませんでした"
このエラーメッセージは、指定したエントリポイントクラスを検索/ロードできなかった場合、 java
コマンドによって出力されます。一般的に言えば、これが起こり得る3つの大きな理由があります。
- 存在しないエントリポイントクラスを指定しました。
- クラスは存在しますが、クラスを正しく指定していません。
- クラスが存在し、クラスパスを正しく指定しましたが、クラスパスが正しくないため、Javaが見つかりません。
問題を診断して解決する手順は次のとおりです。
エントリポイントクラスの完全な名前を確認します。
- クラスのソースコードがある場合、フルネームはパッケージ名と単純なクラス名で構成されます。 "Main"クラスが "com.example.myapp"パッケージで宣言されたインスタンスは、完全名が "com.example.myapp.Main"です。
- コンパイルされたクラスファイルをお持ちの場合は、
javap
を実行してクラス名を見つけることができます。 - クラスファイルがディレクトリにある場合、ディレクトリ名から完全なクラス名を推論することができます。
- クラスファイルがJARファイルまたはZIPファイルの場合、JARファイルまたはZIPファイルのファイルパスから完全なクラス名を推論できます。
java
コマンドのエラーメッセージを見てください。このメッセージは、java
が使用しようとしている完全なクラス名で終了する必要があります。- エントリポイントクラスの完全なクラス名と完全に一致することを確認してください。
- ".java"または ".class"で終わるべきではありません。
- スラッシュまたはJava識別子1で合法でない他の文字を含むべきではありません。
- 名前のケーシングは完全なクラス名と正確に一致する必要があります。
正しいクラス名を使用している場合は、そのクラスが実際にクラスパス上にあることを確認してください。
- クラス名がマップされているパス名を調べてください。 クラス名からパス名へのマッピングを参照してください
- クラスパスが何であるかを調べる。次の例を参照してください。 クラスパスを指定するさまざまな方法
- クラスパス上のJARファイルとZIPファイルのそれぞれに、必要なパス名を持つクラスが含まれているかどうかを確認します。
- 各ディレクトリを調べて、パス名がディレクトリ内のファイルに解決されるかどうかを確認します。
手でクラスパスを確認しても問題が見つからない場合は、 -Xdiag
と-XshowSettings
オプションを追加できます。前者はロードされているすべてのクラスをリストし、後者はJVMの実効クラスパスを含む設定を出力します。
最後に、この問題のいくつかの不明確な原因があります。
- 存在しないクラスを指定する
Main-Class
属性を持つ実行可能なJARファイル。 - 不正な
Class-Path
属性を持つ実行可能なJARファイル。 - クラス名の前に2つのオプションを混乱させた場合、
java
コマンドはクラス名の1つを解釈しようとします。 - 誰かがJavaスタイルルールを無視して、大文字小文字だけが異なるパッケージまたはクラス識別子を使用し、ファイル名の大文字小文字を重要でないものとして扱うプラットフォームで実行している場合。
- コード内またはコマンドライン上のクラス名にホモグリフに関する問題
"メインメソッドがクラス<name>に見つかりません"
この問題は、 java
コマンドが指名したクラスを見つけて読み込めるが、エントリポイントメソッドを見つけることができない場合に発生する。
説明には3つの可能性があります。
- 実行可能なJARファイルを実行しようとすると、JARのマニフェストに、有効なエントリポイントクラスではないクラスを指定する不正な「Main-Class」属性があります。
- あなたは、エントリポイントクラスではないクラスを
java
コマンドに伝えました。 - エントリポイントクラスが正しくありません。詳細については、「 エントリポイントクラス」を参照してください。
その他のリソース
- 「メインクラスが見つからないかロードできませんでした」とはどういう意味ですか?
- http://docs.oracle.com/javase/tutorial/getStarted/problems/index.html
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シェルにはsh
やbash
やksh
などの派生物も含まれています。これらのシェルのいずれかを使用している場合は、引数を引用することで問題を解決できます。
$ 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
コマンドの公式マニュアルを確認してください。場合によっては、 標準オプションが「変更対象」として記述されることもあります。