Javaでコマンドライン引数を解析する良い方法は何ですか?
20 に答える
これらをチェックしてください:
または、独自のロール:
たとえば、これはcommons-cli
2 つの文字列引数を解析するために使用する方法です。
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
最近のJCommanderを見てください。
私はそれを作成しました。質問や機能のリクエストをお待ちしております。
Java CLI パーサーのリストを維持しようとしています。
- 航空会社
- アクティブフォーク: https://github.com/rvesse/airline
- argparse4j
- argparser
- args4j
- クラジル
- cli パーサー
- CmdLn
- コマンドライン
- DocOpt.java
- ドルフィンゲットオプト
- DPML CLI (ジャカルタコモンズ CLI2 フォーク)
- マティアス・ラウクス博士
- ジャカルタコモンズ CLI
- 専門用語
- jargp
- ジャーグ
- java-getopt
- ジボック
- JCLAP
- jcmdline
- 司令官
- jcommando
- ジュエルクリ(自作)
- JOpt シンプル
- jsap
- ナチュラルクリ
- Object Mentor CLI の記事 (リファクタリングと TDD の詳細)
- parse-cmd
- リトプト
- ロップ
- TEコードコマンド
- picocliには、ANSI のカラー化された使用法ヘルプとオートコンプリートがあります
2022 年、Commons CLI よりもうまくやる時が来ました... :-)
独自の Java コマンド ライン パーサーを作成する必要がありますか、それともライブラリを使用する必要がありますか?
多くの小さなユーティリティのようなアプリケーションは、追加の外部依存関係を回避するために、おそらく独自のコマンド ライン解析を実行します。picocliは、興味深い代替手段になる可能性があります。
Picocli は、強力でユーザーフレンドリーな GraalVM 対応のコマンドライン アプリを簡単に構築するための最新のライブラリおよびフレームワークです。これは 1 つのソース ファイルに存在するため、アプリはそれをソースとして含めて、依存関係の追加を回避できます。
色、オートコンプリート、サブコマンドなどをサポートしています。Java で書かれており、Groovy、Kotlin、Scala などから使用できます。
特徴:
- 注釈ベース:宣言的、重複を避け、プログラマーの意図を表現
- 便利: ユーザー入力を解析し、1 行のコードでビジネス ロジックを実行します
- 厳密に型指定されたすべて - コマンド ライン オプションと位置パラメータ
- POSIX クラスター化された短いオプション (
<command> -xvfInputFile
および<command> -x -v -f InputFile
) - きめの細かい制御: パラメーターの最小数、最大数、および可変数を許可するアリティ モデル
"1..*"
。"3..5"
- サブコマンド(任意の深さまでネスト可能)
- 豊富な機能: 構成可能な引数グループ、引用符で囲まれた引数の分割、繰り返し可能なサブコマンドなど
- ユーザーフレンドリー: 使い方のヘルプ メッセージは色を使用して、オプション名などの重要な要素を残りの使い方のヘルプと対比し、ユーザーの認知的負荷を軽減します。
- アプリをGraalVM ネイティブ イメージとして配布する
- Java 5以降で動作
- 広範かつ綿密なドキュメント
使い方のヘルプ メッセージは、注釈を使用して簡単にカスタマイズできます (プログラミングなしで)。例えば:
(ソース)
スクリーンショットをもう 1 つ追加して、どのような使用方法のヘルプ メッセージが可能かを示すことに抵抗できませんでした。使い方のヘルプはアプリケーションの顔なので、創造性を発揮して楽しんでください!
免責事項: picocli を作成しました。フィードバックや質問は大歓迎です。
最近、注釈ベースのargs4jを誰かが教えてくれました。私は本当にそれが好き!
私は JOpt を使用しましたが、非常に便利であることがわかりました: http://jopt-simple.sourceforge.net/
フロント ページには、約 8 つの代替ライブラリのリストも表示されます。それらをチェックして、ニーズに最も適したものを選択してください。
これは、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));
}
}
Commons CLIプロジェクトを見てみましょう。そこにはたくさんの優れた機能があります。
うん。
次のようなものを探していると思います: http://commons.apache.org/cli
Apache Commons CLI ライブラリは、コマンド ライン インターフェイスを処理するための API を提供します。
多分これら
Java 用の JArgs コマンド ライン オプション解析スイート- この小さなプロジェクトは、Java プログラマーが使用するコマンド ライン オプション パーサーの便利でコンパクトな、事前にパッケージ化され、包括的に文書化されたスイートを提供します。最初は、GNU スタイルの 'getopt' と互換性のある解析が提供されます。
ritopt、Java 用の究極のオプション パーサー- いくつかのコマンド ライン オプション標準が提案されていますが、ritopt は opt パッケージで規定されている規則に従います。
私は別のものを書きました: http://argparse4j.sourceforge.net/
Argparse4j は、Python の argparse に基づいた、Java 用のコマンド ライン引数パーサー ライブラリです。
gnu getopt に精通している場合は、http ://www.urbanophile.com/arenn/hacking/download.htm に Java ポートがあります。
これを行ういくつかのクラスがあるようです:
航空会社 @ Githubは良さそうです。これは注釈に基づいており、Git コマンド ライン構造をエミュレートしようとしています。