647

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

4

20 に答える 20

490

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

または、独自のロール:


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

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 = null;//not a good practice, it serves it purpose 

        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
于 2008-12-15T07:49:15.980 に答える
322

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

私はそれを作成しました。質問や機能のリクエストをお待ちしております。

于 2010-07-26T16:52:58.913 に答える
90

2022 年、Commons CLI よりもうまくやる時が来ました... :-)

独自の Java コマンド ライン パーサーを作成する必要がありますか、それともライブラリを使用する必要がありますか?

多くの小さなユーティリティのようなアプリケーションは、追加の外部依存関係を回避するために、おそらく独自のコマンド ライン解析を実行します。picocliは、興味深い代替手段になる可能性があります。

Picocli は、強力でユーザーフレンドリーな GraalVM 対応のコマンドライン アプリを簡単に構築するための最新のライブラリおよびフレームワークです。これは 1 つのソース ファイルに存在するため、アプリはそれをソースとして含めて、依存関係の追加を回避できます。

色、オートコンプリート、サブコマンドなどをサポートしています。Java で書かれており、Groovy、Kotlin、Scala などから使用できます。

ANSI カラーの最小限の使用ヘルプ

特徴:

  • 注釈ベース:宣言的、重複を避け、プログラマーの意図表現
  • 便利: ユーザー入力を解析し、1 行のコードでビジネス ロジックを実行します
  • 厳密に型指定されたすべて - コマンド ライン オプションと位置パラメータ
  • POSIX クラスター化された短いオプション (<command> -xvfInputFileおよび<command> -x -v -f InputFile)
  • きめの細かい制御: パラメーターの最小数、最大数、および可変数を許可するアリティ モデル"1..*""3..5"
  • サブコマンド(任意の深さまでネスト可能)
  • 豊富な機能: 構成可能な引数グループ、引用符で囲まれた引数の分割、繰り返し可能なサブコマンドなど
  • ユーザーフレンドリー: 使い方のヘルプ メッセージはを使用して、オプション名などの重要な要素を残りの使い方のヘルプと対比し、ユーザーの認知的負荷を軽減します。
  • アプリをGraalVM ネイティブ イメージとして配布する
  • Java 5以降で動作
  • 広範かつ綿密なドキュメント

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

拡張使用ヘルプ メッセージソース

スクリーンショットをもう 1 つ追加して、どのような使用方法のヘルプ メッセージが可能かを示すことに抵抗できませんでした。使い方のヘルプはアプリケーションの顔なので、創造性を発揮して楽しんでください!

picocli デモ

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

于 2017-05-04T10:31:44.193 に答える
24

最近、注釈ベースのargs4jを誰かが教えてくれました。私は本当にそれが好き!

于 2008-12-15T18:07:58.883 に答える
23

私は JOpt を使用しましたが、非常に便利であることがわかりました: http://jopt-simple.sourceforge.net/

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

于 2008-12-15T07:50:56.790 に答える
11

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

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

インストール

バゼル

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

グラドル

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>

使用法

(s)を拡張OptionsBaseおよび定義するクラスを作成します。@Option

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

于 2016-12-07T16:13:43.203 に答える
9

Commons CLIプロジェクトを見てみましょう。そこにはたくさんの優れた機能があります。

于 2008-12-15T07:50:00.317 に答える
8

うん。

次のようなものを探していると思います: http://commons.apache.org/cli

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

于 2008-12-15T07:51:38.830 に答える
7

多分これら

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

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

于 2008-12-15T07:50:03.483 に答える
6

私は別のものを書きました: http://argparse4j.sourceforge.net/

Argparse4j は、Python の argparse に基づいた、Java 用のコマンド ライン引数パーサー ライブラリです。

于 2012-09-04T14:24:33.623 に答える
5

gnu getopt に精通している場合は、http ://www.urbanophile.com/arenn/hacking/download.htm に Java ポートがあります。

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

于 2008-12-15T08:04:01.163 に答える
4

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

于 2013-04-09T07:57:32.407 に答える