回答:
場合によっては、プログラムはさまざまな方法で実行され、呼び出される方法についてさまざまな動作を示すことがあります。vim
として呼び出すとvi
、互換モードで実行されます。時には、いくつかの関連プログラムの1つのバージョンを維持しようとすることがあります。たとえばmailq
、newaliases
多くのUNIXシステムでは、sendmail
これらのプログラムの同期を保つためのリンクがあります)
Javaプログラムは通常、次のように呼び出されます。
%java -jar foo.jar args %java Foo args
最初のバージョンでは、メインクラスを示すマニフェストファイルがあります。2番目のバージョンFoo
では、クラスパスで見つかったクラスのメインメソッドが実行されます。
Java用に表示される情報は、jarへのパスまたは呼び出されるクラスの名前です。
jarの場所は、コーディングの対象となるほど重要ではありません(実際には、元の仕様の一部ではありませんでした)。Jarには実際に名前を付けることができ、多くの場合バージョン番号が含まれます。さらに、クラスが.jarに保存されたという保証はありません(抽出された可能性があります)。
を使用し-jar
てJavaアプリケーションを呼び出す方法は、マニフェストで定義されたクラスの1つしかありません。実行できる名前の変更はありません。
クラス名で呼び出す別のオプションは、実行ユニットを直接指します。さらに、それは複数の名前を付けることはできません-あなたはそれがそのように動作しないだけBar.class
のコードになるclass Foo
ことはできません。
これはargv[0]
、Cの意味での情報をJavaアプリケーションに渡す意味がないことを示しているはずです- java
意味がなく、任意であるか、呼び出されているクラスの名前(既にコードを実行していること)の(あなたgetClass().getEnclosingClass().getName()
が必死だった場合のような何かをすることができます...))。
ここにはポイントがあります。複数のMainメソッドを.jarのクラスまたはクラスパスで定義できます。また、何argv[0]
に基づいて一連のifステートメントがあるかのように、それらを異なる動作にすることができます。
私は過去に、マニフェストで定義されたもので定義されたものではなくjava -cp Foo.jar com.me.foo.Test
、Test
クラスのMainメソッドを呼び出したコードに似ていました。
java com.me.Foo
コマンドラインとして指定すると、メソッドcom.me.Foo.main(String...)
が呼び出されます。それを回避する方法はありません。呼び出されているのはFooであることを知っています。それをargvに固定する理由はありません。それは純粋に冗長な情報です。もちろん、それはスーパークラスにある可能性がありますが、コマンドライン呼び出しが何であるかという望ましい情報でそれをインターセプトする簡単な機会があります-argvに入れる必要はありません。
実際には利点はありません。0ベースまたは1ベースの場合、使用しているプログラミング言語の構文に依存します。変数(ファイル名と呼ぶ)も言語に依存します。他の言語では、使用している言語の正しい構文に従うだけで異なる場合があります。
foo.exe
ます。