Статьи

Интерфейсы командной строки Java (часть 2): args4j

В моем предыдущем посте я рассмотрел синтаксический анализ аргументов командной строки в приложениях Java с использованием Apache Commons CLI . В этом посте я расскажу о том же, используя другую библиотеку: args4j .

args4j использует другой подход к указанию того, какие аргументы командной строки должно ожидать приложение Java, чем тот, который используется CLI Commons. В то время как CLI Commons ожидает, что объекты, представляющие параметры, будут создаваться индивидуально и явно, args4j использует пользовательские аннотации для облегчения этого «определения» этапа обработки аргументов командной строки. Ожидается, что параметры командной строки будут полями уровня экземпляра в классе и аннотируются аннотацией @ org.kohsuke.args4j.Option . Характеристики каждого аргумента командной строки включены в качестве атрибутов этой аннотации @Option .

Простое приложение, продемонстрированное в этом посте, аналогично тому, которое использовалось в моем предыдущем посте, и фокусируется на необязательной и бесполезной опции -v для указания многословности и обязательной опции -f которая ожидает значение, представляющее путь и имя файла. Следующий листинг кода демонстрирует использование аннотации @Option @Option для установки этих аргументов командной строки в качестве аннотации для членов данных класса.

args4j Определение аргументов командной строки через аннотации @Option

1
2
3
4
5
@Option(name="-v", aliases="--verbose", usage="Print verbose status.")
private boolean verbose;
 
@Option(name="-f", aliases="--file", usage="Fully qualified path and name of file.", required=true)
private String fileName;

Как показано в приведенном выше листинге кода, легко указать название параметров, их использование и то, требуются ли они (по умолчанию не является обязательным). Наличие private модификатора выше делает очевидным, что это атрибуты, определенные на уровне класса. Поскольку static модификатора нет, мы видим, что это переменные экземпляра, которые были аннотированы.

Чтобы проанализировать параметры командной строки, нужно просто создать экземпляр CmdLineParser и передать аргументы командной строки его методу parseArguments (String…) :

Разбор аргументов командной строки в args4j

1
2
3
4
5
6
7
8
9
final CmdLineParser parser = new CmdLineParser(this);
try
{
   parser.parseArgument(arguments);
}
catch (CmdLineException clEx)
{
   out.println("ERROR: Unable to parse command-line options: " + clEx);
}

В только что показанной первой строке Java-кода this ссылка на экземпляр класса, в котором переменные-члены, показанные выше, определены и @Option аннотацией @Option . В этом случае я использовал this потому что тот же класс, который определяет эти параметры, является тем, который вызывает этот метод синтаксического анализа. Чтобы сделать это в том же классе, мне нужно было иметь экземплярный ( static ) метод с именем doMain определенный в классе и вызываемый main функцией класса (это показано в полном листинге кода в конце этого поста). Аргументы командной строки, полученные из функции main(final String[]) класса, представляют собой массив строк, передаваемых parseArguments(String[]) .

Следующие два снимка экрана демонстрируют применение описанного кода на основе args4j для анализа аргументов командной строки. На первом изображении показаны комбинации коротких и длинных опций для двух опций. Второе изображение показывает автоматическое сообщение о случае, когда требуемый аргумент командной строки не был предоставлен.

Важной особенностью библиотеки синтаксического анализа командной строки является возможность отображения информации об использовании или помощи. Следующий листинг кода демонстрирует пример этого с помощью метода args4j CmdLineParser.printUsage (OutputStream) .

Печать информации об использовании с args4j

1
2
3
4
5
6
final CmdLineParser parser = new CmdLineParser(this);
if (arguments.length < 1)
{
   parser.printUsage(out);
   System.exit(-1);
}

Информация об использовании, распечатанная args4j по умолчанию, показана на следующем снимке экрана.

В этом посте продемонстрировано использование arg4j для достижения некоторых наиболее распространенных функций, связанных с синтаксическим анализом командной строки в приложениях Java, включая параметр «определение», аргументы командной строки «синтаксический анализ», «опрос» проанализированных аргументов командной строки и справку. / подробности использования, связанные с аргументами командной строки. Полный листинг кода для класса, частично представленного выше в листингах кода, теперь показан.

Полный листинг кода для демонстрации args4j Main.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package examples.dustin.commandline.args4j;
 
import static java.lang.System.out;
 
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
 
import java.io.IOException;
 
/**
 * Demonstrate args4j.
 */
public class Main
{
   @Option(name="-v", aliases="--verbose", usage="Print verbose status.")
   private boolean verbose;
 
   @Option(name="-f", aliases="--file", usage="Fully qualified path and name of file.", required=true)
   private String fileName;
 
   private void doMain(final String[] arguments) throws IOException
   {
      final CmdLineParser parser = new CmdLineParser(this);
      if (arguments.length < 1)
      {
         parser.printUsage(out);
         System.exit(-1);
      }
      try
      {
         parser.parseArgument(arguments);
      }
      catch (CmdLineException clEx)
      {
         out.println("ERROR: Unable to parse command-line options: " + clEx);
      }
      out.println("The file '" + fileName + "' was provided and verbosity is set to '" + verbose + "'.");
   }
 
   /**
    * Executable function demonstrating Args4j command-line processing.
    *
    * @param arguments Command-line arguments to be processed with Args4j.
    */
   public static void main(final String[] arguments)
   {
      final Main instance = new Main();
      try
      {
         instance.doMain(arguments);
      }
      catch (IOException ioEx)
      {
         out.println("ERROR: I/O Exception encountered: " + ioEx);
      }
   }
}

Вот некоторые дополнительные характеристики args4j, которые следует учитывать при выборе фреймворка или библиотеки, чтобы помочь с анализом командной строки в Java.

  • args4j имеет открытый исходный код и лицензируется по лицензии MIT .
  • Текущая версия args4j ( 2.33 ) требует J2SE 5 .
  • args4j не требует загрузки сторонних библиотек или ссылки на них отдельно.
  • Основной JAR args4j-2.33.jar args4j 2.33 ( args4j-2.33.jar ) имеет размер приблизительно 152 КБ.
  • Репозиторий Maven показывает 376 зависимостей от args4j, включая JJH Core OpenJDK и Jenkins (что неудивительно, учитывая участие Kohsuke Kawaguchi в обоих).
  • args4j был вокруг некоторое время; его релиз 2.0.3 был в январе 2006 года, и в какой-то степени он появился по крайней мере с 2003 года .
  • args4j позволяет исключить параметр командной строки из вывода об использовании через « hidden » в аннотации @Option .
  • args4j позволяет указывать и применять отношения между аргументами командной строки. Это включает возможность указать, когда два аргумента не могут быть предоставлены одновременно (« запрещает »), и когда наличие аргумента имеет смысл, только если предоставлен другой аргумент (« зависит »).
  • args4j поддерживает использование атрибутов класса с типом enum для случаев, когда к опции применяется конечный набор значений. Документация @Option описывает, как это сделать, в разделе «Enum Switch».
  • args4j обеспечивает расширяемость и настраиваемость разбора аргументов командной строки через свой класс OptionHandler .

Библиотека args4j проста в использовании и позволяет легко читать код. Возможно, самое большое соображение при принятии решения о том, использовать ли args4j, — это решить, насколько удобно использовать аннотации для определения определений параметров командной строки.

Дополнительные ссылки