Java에서 명령줄 인수를 해석하려면 어떻게 해야 합니까?
Java에서 명령줄 인수를 해석하는 좋은 방법은 무엇입니까?
다음 항목을 확인하십시오.
또는 직접 롤링할 수도 있습니다.
예를 들어, 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를 보세요.
내가 만들었어.질문이나 기능 요청을 받게 되어 기쁩니다.
- 항공사.
- 액티브 포크: https://github.com/rvesse/airline
- argparse4j
- argparser
- args4j
- 클래스
- CLI 파서
- cmdLn
- 명령줄
- DocOpt.java
- 돌고래 겟옵트
- DPML CLI(Jakarta Commons CLI2 포크)
- 마티아스 로크 박사
- 자카르타 커먼즈 CLI
- 자르고
- jargp
- 자그마치
- java-getopt
- 잽싸움하다
- JCLAP
- jcmdline
- jcommander
- 특공대
- jewelcli(저작)
- JOPT 심플
- 맵
- 내추럴 클리
- Object Mentor CLI 기사(리팩터링 및 TDD에 대한 자세한 내용)
- 구문 분석
- 선택하다
- rop
- TE-Code 명령어
- 피코클리에는 ANSI 색상화된 사용 도움말과 자동 완성 기능이 있습니다.
2022년, Commons CLI보다 더 잘해야 할 때... :-)
독자적인 Java 명령줄 파서를 구축해야 합니까, 아니면 라이브러리를 사용해야 합니까?
대부분의 소규모 유틸리티와 유사한 응용 프로그램은 추가적인 외부 종속성을 피하기 위해 자체 명령줄 해석을 롤링합니다.피코클리는 흥미로운 대안이 될 수 있다.
Picocli는 강력하고 사용하기 쉬운 GraalVM 지원 명령줄 앱을 쉽게 구축하기 위한 최신 라이브러리이자 프레임워크입니다.이 파일은 하나의 소스 파일에 존재하므로 종속성을 추가하지 않도록 앱에서 이를 소스로 포함할 수 있습니다.
색상, 자동 완성, 하위 명령 등을 지원합니다.Java로 작성되어 Groovy, Kotlin, Scala 등에서 사용 가능
특징:
- 주석 기반: 선언적, 중복 방지 및 프로그래머의 의도 표현
- 편리성: 사용자 입력을 해석하여 코드 한 줄로 비즈니스 로직을 실행
- 모두 강력 입력 - 명령줄 옵션 및 위치 매개 변수
- POSIX の 。
<command> -xvfInputFile만 아니라<command> -x -v -f InputFile) - 세밀한 제어: 파라미터의 최소, 최대 및 가변 수를 허용하는 Arity 모델. 예를 들어 다음과 같습니다.
"1..*","3..5" - 하위 명령(임의 깊이로 중첩할 수 있음)
- 풍부한 기능: 구성 가능한 arg 그룹, 따옴표로 묶인 arg 분할, 반복 가능한 서브 명령어 등
- 사용자 친화적: 사용법 도움말 메시지는 색상을 사용하여 옵션 이름 등의 중요한 요소를 다른 사용법에서 대조함으로써 사용자의 인식 부하를 줄입니다.
- GraalVM 네이티브 이미지로 앱 배포
- Java 5 이상과 연동
- 광범위하고 꼼꼼한 문서
사용 도움말 메시지는 주석을 사용하여(프로그래밍 없이) 쉽게 사용자 정의할 수 있습니다.예를 들어 다음과 같습니다.
(소스)
사용할 수 있는 도움말 메시지를 보여주기 위해 스크린샷을 하나 더 추가하지 않을 수 없었습니다.사용법 도움말은 어플리케이션의 페이스이므로 창의적으로 즐겨보세요!
면책사항:나는 피코클리를 만들었다.피드백이나 질문을 환영합니다.
최근에 누군가가 주석 기반의 args4j를 나에게 알려주었다.정말 마음에 들어요!
JOpt를 사용해 본 결과, 매우 편리했습니다.http://jopt-simple.sourceforge.net/
또, 1 페이지에는, 약 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>
사용.
확장 클래스 만들기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
여기 있는 대부분의 사람들이 왜 내 방식을 싫어하는지 천만 가지 이유를 찾을 거라는 걸 알지만, 신경 쓰지 마.저는 단순하게 하는 것을 좋아하기 때문에 '='를 사용하여 키와 값을 구분하여 HashMap에 저장합니다.
Map<String, String> argsMap = new HashMap<>();
for (String arg: args) {
String[] parts = arg.split("=");
argsMap.put(parts[0], parts[1]);
}
사용자가 인수를 잊어버렸거나 잘못된 인수를 사용한 경우 언제든지 사용자가 사용할 수 있도록 사용자가 원하는 인수가 포함된 목록을 유지할 수 있습니다.그러나 기능이 너무 많이 필요한 경우에는 이 솔루션이 적합하지 않습니다.
Commons CLI 프로젝트를 보세요. 좋은 것들이 많이 들어있어요.
응.
다음과 같은 것을 찾고 계신 것 같습니다.http://commons.apache.org/cli
Apache Commons CLI 라이브러리는 명령줄 인터페이스를 처리하기 위한 API를 제공합니다.
아마 이것들
Java용 JArgs 명령줄 옵션 구문 분석 스위트 - 이 작은 프로젝트는 Java 프로그래머를 사용하기 위한 편리하고 콤팩트하며 패키지화된 포괄적인 문서화된 명령줄 옵션 파서 스위트를 제공합니다.처음에는 GNU 스타일의 'getopt'와 호환되는 파싱이 제공됩니다.
ritopt, The Ultimate Options 파서 for Java - 몇 가지 명령줄 옵션 표준이 사전에 배치되어 있지만 ritopt는 opt 패키지에 규정된 규칙을 따릅니다.
이미 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;
// ...
}
또 다른 글을 썼습니다.http://argparse4j.sourceforge.net/
Argparse4j는 Python의 Argparse를 기반으로 하는 Java용 명령줄 인수 파서 라이브러리입니다.
gnu getopt에 익숙한 경우 http://www.urbanophile.com/arenn/hacking/download.htm에 Java 포트가 있습니다.
이를 수행하는 클래스가 몇 개 있는 것 같습니다.
- http://docs.sun.com/source/816-5618-10/netscape/ldap/util/GetOpt.html
- http://xml.apache.org/xalan-j/apidocs/org/apache/xalan/xsltc/cmdline/getopt/GetOpt.html
airline @ Github은 좋아 보인다.주석을 기반으로 Git 명령줄 구조를 에뮬레이트하려고 합니다.
Argparse4j가 내가 찾은 것 중 최고야.Python의 argparse libary를 모방하여 매우 편리하고 강력합니다.
가볍고(jar size ~ 20kb) 사용하기 쉬운 것을 원하는 경우 인수 파서를 사용할 수 있습니다.대부분의 사용 사례에서 사용할 수 있으며 인수로 어레이를 지정할 수 있으며 다른 라이브러리에 의존하지 않습니다.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);
}
자세한 예시는 이쪽에서 보실 수 있습니다.
장점:
- 게으른 프로그래머의 경우: 학습해야 할 클래스의 수가 매우 적습니다.레포지토리내의 README 의 2 개의 작은 예를 참조해 주세요.학습의 90%를 이미 학습하고 있습니다.다른 지식 없이 CLI/Parser 의 코딩을 시작하면 됩니다.ReadyCLI 에서는 가장 자연스러운 방법으로 CLI 를 코딩할 수 있습니다.
- Developer Experience를 염두에 두고 설계되었으며, 주로 Lambda Expressions용 Builder 설계 패턴과 기능 인터페이스를 사용하여 매우 빠른 코딩이 가능합니다.
- 옵션, 플래그 및 하위 명령을 지원합니다.
- 명령줄에서 인수를 해석하여 보다 복잡하고 인터랙티브한 CLI를 구축할 수 있습니다.
- CLI는 소켓 등의 다른 I/O 인터페이스와 마찬가지로 Standard I/O에서도 쉽게 시작할 수 있습니다.
- 명령어 문서화를 크게 지원합니다.
새로운 기능(옵션, 플래그, 서브 커맨드)이 필요하기 때문에, 이 프로젝트를 개발했습니다.이 기능은 프로젝트에서 가장 간단한 방법으로 사용할 수 있습니다.
앞서 말한 코멘트 중 하나(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
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(동일한 기능의 JAPT 구현)도 언급해야 합니다.Spring의 장점은 명령줄 인수를 Atribute에 직접 바인드할 수 있다는 것입니다.다음의 예를 제시하겠습니다.https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/CommandLinePropertySource.html
언급URL : https://stackoverflow.com/questions/367706/how-do-i-parse-command-line-arguments-in-java
'programing' 카테고리의 다른 글
| vue-disable을 사용하지 않도록 설정할 수 없음 (0) | 2022.07.18 |
|---|---|
| VueJS 구문: 마운트에서 실행 중인 메서드 (0) | 2022.07.18 |
| 대신 프로펠러 값을 기반으로 데이터 또는 계산된 속성을 사용하십시오.Vue JS (0) | 2022.07.18 |
| 슈퍼 하이 퍼포먼스 C/C++ 해시 맵(표, 사전) (0) | 2022.07.18 |
| instance of와 Class.isAssignableFrom(...)의 차이점은 무엇입니까? (0) | 2022.07.17 |

