Який хороший спосіб розбору аргументів командного рядка на 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 рік, час зробити краще, ніж Commons CLI ... :-)
Чи варто створити власний аналізатор командного рядка Java або використовувати бібліотеку?
Багато малих програм, схожих на утиліту, ймовірно, розгортають власний аналіз командного рядка, щоб уникнути додаткової зовнішньої залежності. пікоклі може бути цікавою альтернативою.
Picocli - це сучасна бібліотека та рамка для створення потужних, зручних для користувачів програм із командного рядка з підтримкою GraalVM. Він живе в 1 вихідному файлі, тому додатки можуть включати його як джерело, щоб уникнути додавання залежності.
Він підтримує кольори, автозавершення, підкоманди тощо. Написано на Java, можна використовувати з Groovy, Kotlin, Scala тощо.
Особливості:
<command> -xvfInputFile
як і <command> -x -v -f InputFile
)"1..*"
,"3..5"
Повідомлення довідки про використання легко налаштувати за допомогою приміток (без програмування). Наприклад:
( джерело )
Я не втримався додати ще один знімок екрана, щоб показати, які можливі повідомлення щодо використання можливі. Допомога щодо використання - це обличчя вашої заявки, тому будьте креативними і веселіться!
Відмова: Я створив пікоклі. Відгуки або питання дуже вітаються.
Я використовував JOpt і вважав це досить зручним: http://jopt-simple.sourceforge.net/
На титульній сторінці також міститься список з приблизно 8 альтернативних бібліотек, перегляньте їх і виберіть ту, яка найбільше відповідає вашим потребам.
Хтось вказав мені на args4j останнім часом, на основі якого є анотація. Мені дуже подобається!
Це бібліотека розбору командного рядка Google з відкритим джерелом в рамках проекту Bazel. Особисто я думаю, що це найкраще, і набагато простіше, ніж 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>
Створіть клас, який розширює 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
Бібліотека CLI Apache Commons надає API для обробки інтерфейсів командного рядка.
Я знаю, що більшість людей тут знайдуть 10 мільйонів причин, через які вони не люблять мій шлях, але ніколи не мають значення. Мені подобається просто робити речі, тому я просто відокремлюю ключ від значення за допомогою '=' і зберігаю їх у HashMap так:
Map<String, String> argsMap = new HashMap<>();
for (String arg: args) {
String[] parts = arg.split("=");
argsMap.put(parts[0], parts[1]);
}
Ви завжди можете підтримувати список з аргументами, які ви очікуєте, щоб допомогти користувачеві у випадку, якщо він забув аргумент або використав неправильний ... Однак, якщо ви хочете занадто багато функцій, це рішення все одно не для вас.
Можливо, ці
Набір параметрів командного рядка командного рядка JArgs для Java - цей крихітний проект забезпечує зручний, компактний, попередньо упакований та всебічно задокументований набір аналізаторів параметрів командного рядка для використання програмістами Java. Спочатку надається аналіз, сумісний із "getopt" у стилі GNU.
ritopt, The Ultimate Options Parser для Java - Хоча запропоновано декілька стандартів параметрів командного рядка, ritopt дотримується конвенцій, прописаних у пакеті opt.
Ця мета-стаття про нещастя може здатися вам цікавою як стрибок:
http://furiouspurpose.blogspot.com/2008/07/command-line-parsing-libraries-for-java.html
Я написав ще один: http://argparse4j.sourceforge.net/
Argparse4j - це бібліотека аналізаторів аргументів командного рядка для Java, заснована на argparse Python.
Якщо ви знайомі з gnu getopt, є порт Java за адресою: http://www.urbanophile.com/arenn/hacking/download.htm .
Здається, деякі класи, які роблять це:
авіакомпанія @ 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);
}
}
І, нарешті, якщо вам потрібен доступ до ваших аргументів у квасолі, просто введіть ApplicationArguments
:
@Component
public class MyBean {
@Autowired
private ApplicationArguments arguments;
// ...
}
Argparse4j - найкраще, що я знайшов. Це імітує арбітражну бібліотеку Python, яка дуже зручна і потужна.
Якщо ви хочете щось легке (розмір банки ~ 20 кб) і просте у використанні, ви можете спробувати аргумент-аналізатор . Він може використовуватися в більшості випадків використання, підтримує вказівку масивів в аргументі і не має залежності від будь-якої іншої бібліотеки. Він працює для 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
) і повинен використовуватися лише в однопотокових сильно контрольованих ситуаціях.
Оскільки один із коментарів, згаданих раніше ( https://github.com/pcj/google-options ), був би хорошим вибором для початку.
Я хочу доповнити одне:
1) Якщо ви зіткнулися з помилкою відображення парсера, будь ласка, спробуйте скористатися новою версією гуави. у моєму випадку:
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
Для користувачів Spring слід зазначити також 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 тієї самої функціональності). Перевага навесні полягає в тому, що ви можете безпосередньо прив’язувати аргументи командного рядка до атрибутів, тут є приклад https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/ CommandLinePropertySource.html