web-dev-qa-db-ja.com

Javaでコマンドライン引数を解析する方法

Javaでコマンドライン引数を解析するための良い方法は何ですか?

522
lindelof

これらをチェックしてください。

または自分でロールバックする:


例えば、 これは、2つの文字列引数を解析するために commons-cli を使用する方法です。

import org.Apache.commons.cli.*;

public class Main {


    public static void main(String[] args) throws Exception {

        Options options = new Options();

        Option input = new Option("i", "input", true, "input file path");
        input.setRequired(true);
        options.addOption(input);

        Option output = new Option("o", "output", true, "output file");
        output.setRequired(true);
        options.addOption(output);

        CommandLineParser parser = new DefaultParser();
        HelpFormatter formatter = new HelpFormatter();
        CommandLine cmd;

        try {
            cmd = parser.parse(options, args);
        } catch (ParseException e) {
            System.out.println(e.getMessage());
            formatter.printHelp("utility-name", options);

            System.exit(1);
        }

        String inputFilePath = cmd.getOptionValue("input");
        String outputFilePath = cmd.getOptionValue("output");

        System.out.println(inputFilePath);
        System.out.println(outputFilePath);

    }

}

コマンドラインからの使用方法

$> Java -jar target/my-utility.jar -i asd                                                                                       
Missing required option: o

usage: utility-name
 -i,--input <arg>    input file path
 -o,--output <arg>   output file
343
Vinko Vrsalovic

もっと最近の JCommander を見てください。

作成しました。質問や要望があれば喜んで受け取ります。

293
Cedric Beust
219
lexicalscope

私はJOptを使っていてとても便利だと思いました: http://jopt-simple.sourceforge.net/ /

フロントページには、約8つの代替ライブラリの一覧も掲載されていますので、それらをチェックして、最もニーズに合ったものを選択してください。

22
GaryF

最近誰かが私に args4j を指していましたが、これはアノテーションベースです。私は本当にそれが好き!

20
André

購入または構築しますか?

多くの小さなユーティリティのようなアプリケーションは、おそらく追加の外部の依存関係を避けるためにそれら自身のコマンドライン解析をロールバックします。

picocli は面白いかもしれません。これは、jarをuberjarにシェーディングするためのより単純な代替手段としてソースとして含まれるように設計されています。

あなたが好きかもしれないもう一つの機能は、その色分けされた使用法のヘルプです。

Minimal usage help with ANSI colors

パーサーの機能:

  • 注釈ベース:解析は1行のコードです
  • 厳密に型指定されたものすべて - コマンドラインオプションと位置パラメータ
  • POSIXは短いオプションをクラスタ化しました(<command> -xvfInputFile<command> -x -v -f InputFile
  • 最小数、最大数、可変数のパラメータ、例えば"1..*""3..5"を許可するアリティモデル
  • サブコマンド(任意の深さにネストできます)
  • Java 5以降で動作します

使い方のヘルプメッセージは、注釈なしで(プログラミングなしで)簡単にカスタマイズできます。例えば:

Extended usage help message source

どのような使用方法のヘルプメッセージが表示されるのかを示すために、スクリーンショットをもう1つ追加することに抵抗することはできませんでした。使い方のヘルプはあなたのアプリケーションの一面なので、クリエイティブになって楽しんでください。

picocli demo

免責事項:私はpicocliを作成しました。フィードバックや質問は大歓迎です。

11
Remko Popma

これはBazelプロジェクトの一部としてオープンソース化されたGoogleのコマンドライン解析ライブラリです。個人的には、それはそこで最高のものであり、Apache CLIよりはるかに簡単だと思います。

https://github.com/pcj/google-options

Installation

バゼル

maven_jar(
    name = "com_github_pcj_google_options",
    artifact = "com.github.pcj:google-options:jar:1.0.0",
    sha1 = "85d54fe6771e5ff0d54827b0a3315c3e12fdd0c7",
)

Gradle

dependencies {
  compile 'com.github.pcj:google-options:1.0.0'
}

メーベン

<dependency>
  <groupId>com.github.pcj</groupId>
  <artifactId>google-options</artifactId>
  <version>1.0.0</version>
</dependency>

使用法

OptionsBaseを拡張し、あなたの@Option(s)を定義するクラスを作成します。

package example;

import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionsBase;

import Java.util.List;

/**
 * Command-line options definition for example server.
 */
public class ServerOptions extends OptionsBase {

  @Option(
      name = "help",
      abbrev = 'h',
      help = "Prints usage info.",
      defaultValue = "true"
    )
  public boolean help;

  @Option(
      name = "Host",
      abbrev = 'o',
      help = "The server Host.",
      category = "startup",
      defaultValue = ""
  )
  public String Host;

  @Option(
    name = "port",
    abbrev = 'p',
    help = "The server port.",
    category = "startup",
    defaultValue = "8080"
    )
    public int port;

  @Option(
    name = "dir",
    abbrev = 'd',
    help = "Name of directory to serve static files.",
    category = "startup",
    allowMultiple = true,
    defaultValue = ""
    )
    public List<String> dirs;

}

引数を解析して使用してください。

package example;

import com.google.devtools.common.options.OptionsParser;
import Java.util.Collections;

public class Server {

  public static void main(String[] args) {
    OptionsParser parser = OptionsParser.newOptionsParser(ServerOptions.class);
    parser.parseAndExitUponError(args);
    ServerOptions options = parser.getOptions(ServerOptions.class);
    if (options.Host.isEmpty() || options.port < 0 || options.dirs.isEmpty()) {
      printUsage(parser);
      return;
    }

    System.out.format("Starting server at %s:%d...\n", options.Host, options.port);
    for (String dirname : options.dirs) {
      System.out.format("\\--> Serving static files at <%s>\n", dirname);
    }
  }

  private static void printUsage(OptionsParser parser) {
    System.out.println("Usage: Java -jar server.jar OPTIONS");
    System.out.println(parser.describeOptions(Collections.<String, String>emptyMap(),
                                              OptionsParser.HelpVerbosity.LONG));
  }

}

https://github.com/pcj/google-options

9
Paul

Commons CLI プロジェクトを見てください。そこにはたくさんの良いものがあります。

8
Marc Novakowski

そうです。

私はあなたがこのようなものを探していると思います: http://commons.Apache.org/cli

Apache Commons CLIライブラリは、コマンドラインインタフェースを処理するためのAPIを提供します。

8
OscarRyz

たぶんこれら

  • Java用のJArgsコマンドラインオプション解析スイート - この小さなプロジェクトは、Javaプログラマを使用するための便利で、コンパクトで、パッケージ化され、包括的に文書化されたコマンドラインオプションパーサのスイートを提供します。最初は、GNUスタイルの 'getopt'と互換性のある構文解析が提供されています。

  • ritopt、Java用のUltimate Options Parser - いくつかのコマンドラインオプション標準が提案されていますが、ritoptはoptパッケージで規定されている規則に従います。

7
mepcotterell

あなたはこの不幸のメタ記事が飛び跳ねるポイントとして興味深いのを見つけるかもしれません:

http://furiouspurpose.blogspot.com/2008/07/command-line-parsing-libraries-for-Java.html

6
Alex Miller

私は別のものを書いた: http://argparse4j.sourceforge.net/ /

Argparse4jは、Pythonのargparseをベースにした、Java用のコマンドライン引数パーサライブラリです。

5

あなたがGNU getoptに精通しているなら、Javaポートがあります: http://www.urbanophile.com/arenn/hacking/download.htm

これを行うクラスがいくつかあるようです。

5
Ray Tayek

航空会社@ Github よさそうだ。これはアノテーションに基づいており、Gitコマンドライン構造をエミュレートしようとしています。

4
cthiebaud

私は、ほとんどの人が1000万の理由で私の道を嫌う理由を見つけようとしていますが、決して気にしないでください。私は物事を単純にしたいので、 '='を使用してキーを値から分離し、それらを次のようにHashMapに格納します。

Map<String, String> argsMap = new HashMap<>();
for (String arg: args) {
    String[] parts = arg.split("=");
    argsMap.put(parts[0], parts[1]);
} 

ユーザーが引数を忘れた場合や間違った引数を使用した場合に備えて、ユーザーが期待している引数を含むリストを常に保持することができます。

3
John Koumarelas

軽量(jarサイズ〜20 kb)で使いやすいものが必要な場合は、 argument-parser を試してください。ほとんどのユースケースで使用でき、引数に配列を指定することをサポートし、他のライブラリには依存しません。 Java 1.5以上で動作します。以下の抜粋は、その使用方法の例を示しています。

public static void main(String[] args) {
    String usage = "--day|-d day --mon|-m month [--year|-y year][--dir|-ds directoriesToSearch]";
    ArgumentParser argParser = new ArgumentParser(usage, InputData.class);
    InputData inputData = (InputData) argParser.parse(args);
    showData(inputData);

    new StatsGenerator().generateStats(inputData);
}

より多くの例が見つかります ここ

2

それはスレッドセーフではないので、私はApache Common CLIライブラリの使用をお勧めしません。静的な変数とメソッドを持つステートフルクラスを使用して内部作業を行います(OptionBuilderなど)。シングルスレッドで厳密に制御された状況でのみ使用してください。

2
Jakub

Argparse4jは私が見つけた最高のものです。それは非常に便利で強力なPythonのargparseライブラリをまねたものです。

1
Trismegistos

すでにSpring Bootを使用している場合、引数の解析はそのまま使用できます。

起動後に何かを実行する場合は、ApplicationRunnerインターフェイスを実装します。

@SpringBootApplication
public class Application implements ApplicationRunner {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Override
  public void run(ApplicationArguments args) {
    args.containsOption("my-flag-option"); // test if --my-flag-option was set
    args.getOptionValues("my-option");     // returns values of --my-option=value1 --my-option=value2 
    args.getOptionNames();                 // returns a list of all available options
    // do something with your args
  }
}

runメソッドは、コンテキストが正常に起動した後に呼び出されます。

引数にアクセスする必要がある場合beforeアプリケーションコンテキストを起動する場合、単にアプリケーション引数を手動で解析できます。

@SpringBootApplication
public class Application implements ApplicationRunner {

  public static void main(String[] args) {
    ApplicationArguments arguments = new DefaultApplicationArguments(args);
    // do whatever you like with your arguments
    // see above ...
    SpringApplication.run(Application.class, args);
  }

}

最後に、Bean内の引数にアクセスする必要がある場合は、ApplicationArgumentsを挿入するだけです。

@Component
public class MyBean {

   @Autowired
   private ApplicationArguments arguments;

   // ...
}
1
Stefan Haberl

前述のコメントの1つとして( https://github.com/pcj/google-options )、まず最初にお勧めです。

私がアドオンしたいのは、

1)パーサーリフレクションエラーが発生した場合は、新しいバージョンのguavaを使用してください。私の場合:

maven_jar(
    name = "com_google_guava_guava",
    artifact = "com.google.guava:guava:19.0",
    server = "maven2_server",
)

maven_jar(
    name = "com_github_pcj_google_options",
    artifact = "com.github.pcj:google-options:jar:1.0.0",
    server = "maven2_server",
)

maven_server(
    name = "maven2_server",
    url = "http://central.maven.org/maven2/",
)

2)コマンドラインを実行している場合

bazel run path/to/your:project -- --var1 something --var2 something -v something

3)使用方法のヘルプが必要な場合は、次のように入力してください。

bazel run path/to/your:project -- --help
0
stevens