Javaでコマンドライン引数を解析する良い方法は何ですか?
How to parse java command line arguments?
でした。しかし、実際にこれを行うためのコードを作成するのではなく、ツールを使用することを望んでいる人はいます。しかし、ツールなどを検索することは建設的ではありません:(
Javaでコマンドライン引数を解析する良い方法は何ですか?
How to parse java command line arguments?
でした。しかし、実際にこれを行うためのコードを作成するのではなく、ツールを使用することを望んでいる人はいます。しかし、ツールなどを検索することは建設的ではありません:(
回答:
これらをチェックしてください:
またはあなた自身を転がしてください:
たとえば、これは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;
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パーサーのリストを維持しようとしています。
2020年です。CommonsCLIよりも良い結果が得られます... :-)
独自のJavaコマンドラインパーサーを構築するか、ライブラリを使用する必要がありますか?
多くの小さなユーティリティのようなアプリケーションは、おそらく追加の外部依存関係を回避するために、独自のコマンドライン解析を実行します。picocliは興味深い代替手段かもしれません。
Picocliは、強力でユーザーフレンドリーなGraalVM対応のコマンドラインアプリを簡単に構築するための最新のライブラリとフレームワークです。これは1つのソースファイルに存在するため、アプリは依存関係を追加しないようにソースとしてそれを含めることができます。
色、オートコンプリート、サブコマンドなどをサポートしています。Javaで書かれており、Groovy、Kotlin、Scalaなどから使用できます。
特徴:
<command> -xvfInputFile
および<command> -x -v -f InputFile
)"1..*"
。"3..5"
使用法のヘルプメッセージは、アノテーションを使用して簡単にカスタマイズできます(プログラミングなし)。例えば:
(ソース)
使用法のヘルプメッセージが表示される可能性があることを示すために、スクリーンショットをもう1つ追加することに抵抗がありません。使い方のヘルプはあなたのアプリケーションの顔ですので、創造的で楽しんでください!
免責事項:私はピコクリを作成しました。フィードバックや質問は大歓迎です。
最近誰かが注釈ベースのargs4jを私に指摘しました。私は本当にそれが好き!
これは、Bazelプロジェクトの一部としてオープンソース化されたGoogleのコマンドライン解析ライブラリです。個人的には、これが最高の方法だと思います。ApacheCLIよりもはるかに簡単です。
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));
}
}
myexecutable -c file.json -d 42 --outdir ./out
。そして、私はあなたが短い/長い/説明オプションをどのように定義するかわかりません...乾杯
Commons CLIプロジェクトを見てください。たくさんの良いものがそこにあります。
うん。
私はあなたがこのようなものを探していると思います:http : //commons.apache.org/cli
Apache Commons CLIライブラリーは、コマンド行インターフェースを処理するためのAPIを提供します。
私がここにいるほとんどの人は、私のやり方が嫌いな理由が1000万件もあることを知っているでしょうが、気にしないでください。私は物事をシンプルにしたいので、 '='を使用してキーを値から分離し、次のようにHashMapに格納します。
Map<String, String> argsMap = new HashMap<>();
for (String arg: args) {
String[] parts = arg.split("=");
argsMap.put(parts[0], parts[1]);
}
ユーザーが引数を忘れたり、間違った引数を使用したりした場合に役立つように、期待する引数のリストを常に維持することができます。ただし、機能が多すぎる場合、このソリューションはとにかく適していません。
多分これら
Java用のJArgsコマンドラインオプション解析スイート -この小さなプロジェクトは、Javaプログラマー向けの便利でコンパクトなパッケージ済みの包括的なドキュメント化されたコマンドラインオプションパーサースイートを提供します。最初は、GNUスタイルの「getopt」と互換性のある解析が提供されています。
ritopt、The Ultimate Options Parser for Java-いくつかのコマンドラインオプション標準が用意されていますが、ritoptはoptパッケージで規定されている規則に従います。
この不幸のメタ記事はジャンプポイントとして興味深いかもしれません。
http://furiouspurpose.blogspot.com/2008/07/command-line-parsing-libraries-for-java.html
私は別のものを書いた:http : //argparse4j.sourceforge.net/
Argparse4jは、Pythonのargparseに基づいた、Java用のコマンドライン引数パーサーライブラリです。
航空会社@ Githubはよさそうだ。これは注釈に基づいており、Gitコマンドライン構造をエミュレートしようとしています。
すでに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
状況が正常に起動した後にメソッドが呼び出されます。
アプリケーションコンテキストを起動する前に引数にアクセスする必要がある場合は、アプリケーションの引数を手動で解析するだけです。
@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;
// ...
}
軽量(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);
}
その他の例はここにあります
Apache Common CLI
ライブラリはスレッドセーフではないため、ライブラリの使用はお勧めしません。
静的変数とメソッドを含むステートフルクラスを使用して内部処理(例:)を実行しOptionBuilder
、シングルスレッドの厳密に制御された状況でのみ使用する必要があります。
前述のコメントの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
春のユーザーのために、我々はまた、言及する必要がありますhttps://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/SimpleCommandLinePropertySource.html と彼の双子の弟、HTTPSを://docs.spring .io / spring / docs / current / javadoc-api / org / springframework / core / env / JOptCommandLinePropertySource.html(同じ機能のJOpt実装)。Springの利点は、コマンドライン引数を属性に直接バインドできることです。ここに例がありますhttps://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/ CommandLinePropertySource.html