Java Language
コマンドライン引数の処理
サーチ…
構文
- public static void main(String [] args)
パラメーター
パラメータ | 詳細 |
---|---|
args | コマンドライン引数。 main メソッドがJavaランチャーによって呼び出されると仮定すると、 args はnullでなく、 null 要素もありません。 |
備考
通常のJavaアプリケーションをjava
コマンド(または同等のもの)を使用して起動すると、 args
配列のコマンドラインから引数を渡してmain
メソッドが呼び出されます。
残念なことに、Java SEクラスライブラリは、コマンド引数の処理を直接サポートしていません。これにより、2つの選択肢が残されます。
- Javaで手作業で引数処理を実装します。
- サードパーティのライブラリを利用する。
このトピックでは、一般的なサードパーティのライブラリの一部をカバーしようとしています。代替案の広範なリストについては、StackOverflowの質問に対する答えを参照してください。 "Javaでコマンドライン引数を解析する方法は?" 。
GWT ToolBaseによる引数処理
オプションのパラメータなど、より複雑なコマンドライン引数を解析する場合は、GoogleのGWTアプローチを使用するよりも最適です。すべてのクラスは公開されています:
myprogram -dir "~/Documents" -port 8888
のコマンドライン・myprogram -dir "~/Documents" -port 8888
を処理する例は次のとおりです。
public class MyProgramHandler extends ToolBase {
protected File dir;
protected int port;
// getters for dir and port
...
public MyProgramHandler() {
this.registerHandler(new ArgHandlerDir() {
@Override
public void setDir(File dir) {
this.dir = dir;
}
});
this.registerHandler(new ArgHandlerInt() {
@Override
public String[] getTagArgs() {
return new String[]{"port"};
}
@Override
public void setInt(int value) {
this.port = value;
}
});
}
public static void main(String[] args) {
MyProgramHandler myShell = new MyProgramHandler();
if (myShell.processArgs(args)) {
// main program operation
System.out.println(String.format("port: %d; dir: %s",
myShell.getPort(), myShell.getDir()));
}
System.exit(1);
}
}
ArgHandler
には、 isRequired()
メソッドがあります。このメソッドは、コマンドライン引数が必要であると言うために上書きすることができます(デフォルトの戻り値はfalse
で、引数はオプションです)。
手で議論を処理する
アプリケーションのコマンドライン構文が単純な場合は、コマンドコードの処理をすべてカスタムコードで行うのが妥当です。
この例では、一連の簡単なケーススタディを紹介します。いずれの場合も、引数が受け入れられない場合、コードはエラーメッセージを生成し、コマンドが失敗したことをシェルに伝えるためにSystem.exit(1)
を呼び出します。 (いずれの場合も、Javaコードは、名前が "myapp"のラッパーを使用して呼び出されると仮定します)。
引数のないコマンド
このケーススタディでは、コマンドは引数を必要としません。このコードは、 args.length
がコマンドライン引数の数を示していることを示しています。
public class Main {
public static void main(String[] args) {
if (args.length > 0) {
System.err.println("usage: myapp");
System.exit(1);
}
// Run the application
System.out.println("It worked");
}
}
2つの引数を持つコマンド
このケーススタディでは、コマンドは正確に2つの引数を必要とします。
public class Main {
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("usage: myapp <arg1> <arg2>");
System.exit(1);
}
// Run the application
System.out.println("It worked: " + args[0] + ", " + args[1]);
}
}
args.length
チェックを怠ると、ユーザがコマンドライン引数をあまりにも少なすぎて実行した場合、コマンドがクラッシュすることに注意してください。
"フラグ"オプションと少なくとも1つの引数を持つコマンド
このケーススタディでは、コマンドには2つの(オプションの)フラグオプションがあり、オプションの後に少なくとも1つの引数が必要です。
package tommy;
public class Main {
public static void main(String[] args) {
boolean feelMe = false;
boolean seeMe = false;
int index;
loop: for (index = 0; index < args.length; index++) {
String opt = args[index];
switch (opt) {
case "-c":
seeMe = true;
break;
case "-f":
feelMe = true;
break;
default:
if (!opts.isEmpty() && opts.charAt(0) == '-') {
error("Unknown option: '" + opt + "');
}
break loop;
}
}
if (index >= args.length) {
error("Missing argument(s)");
}
// Run the application
// ...
}
private static void error(String message) {
if (message != null) {
System.err.println(message);
}
System.err.println("usage: myapp [-f] [-c] [ <arg> ...]");
System.exit(1);
}
}
見て分かるように、コマンド構文が複雑な場合は、引数とオプションの処理が面倒になります。 "コマンドライン解析"ライブラリを使用することをお勧めします。他の例を参照してください。