Java Language
Обработка аргументов командной строки
Поиск…
Синтаксис
- public static void main (String [] args)
параметры
параметр | подробности |
---|---|
арг | Аргументы командной строки. Предполагая, что main метод вызывается Java-пусковой установкой, args будет не нулевым и не будет иметь null элементов. |
замечания
Когда обычное Java-приложение запускается с использованием команды java
(или эквивалента), вызывается main
метод, передающий аргументы из командной строки в массиве args
.
К сожалению, библиотеки классов Java SE не обеспечивают прямой поддержки обработки аргументов команды. Это дает вам две альтернативы:
- Реализовать обработку аргументов вручную в Java.
- Используйте стороннюю библиотеку.
Эта тема попытается охватить некоторые из более популярных сторонних библиотек. Подробный список альтернатив см. В этом ответе на вопрос StackOverflow «Как анализировать аргументы командной строки в Java?» ,
Обработка аргументов с использованием GWT ToolBase
Если вы хотите анализировать более сложные аргументы командной строки, например, с необязательными параметрами, лучше всего использовать подход GWT Google. Все классы доступны по адресу:
https://gwt.googlesource.com/gwt/+/2.8.0-beta1/dev/core/src/com/google/gwt/util/tools/ToolBase.java
Пример для обработки командной строки 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");
}
}
Команда с двумя аргументами
В этом случае-исследовании команда требует только двух аргументов.
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
, команда выйдет из строя, если пользователь запустит ее с слишком небольшим количеством аргументов командной строки.
Команда с параметрами «флаг» и, по крайней мере, один аргумент
В данном случае команда имеет пару (необязательных) опций флага и требует по крайней мере одного аргумента после опций.
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);
}
}
Как вы можете видеть, обработка аргументов и опций становится довольно громоздкой, если синтаксис команды является сложным. Целесообразно использовать библиотеку «синтаксический анализ командной строки»; см. другие примеры.