Java에서 명령 행 인수를 구문 분석하는 좋은 방법은 무엇입니까?
답변
이것들을 확인하십시오 :
또는 자신의 롤 :
예를 들어 다음은 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
답변
답변
Java CLI 파서 목록 을 유지하려고했습니다 .
- 공기 호스
- 액티브 포크 : https://github.com/rvesse/airline
- argparse4j
- 아가 파서
- args4j
- clajr
- 진료소 파서
- CmdLn
- 커맨드 라인
- DocOpt.java
- 돌고래 getopt
- DPML CLI (자카르타 커먼즈 CLI2 포크)
- 마티아스 로크 박사
- 자카르타 커먼즈 CLI
- 자고
- jargp
- 항아리
- 자바-getopt
- jb
- JCLAP
- jcmdline
- 사령관
- jcommando
- jewelcli (필자)
- 간단한 작업
- jsap
- Naturalcli
- Object Mentor CLI 기사 (리팩토링 및 TDD에 대한 추가 정보)
- 파싱 -cmd
- 리 토프
- 로프
- TE 코드 명령
- picocli 에는 ANSI 색상 사용 도움말과 자동 완성 기능이 있습니다
답변
그것은 Commons CLI보다 더 나은 시간을 2020입니다 … 🙂
자체 Java 명령 행 구문 분석기를 빌드하거나 라이브러리를 사용해야합니까?
많은 작은 유틸리티 유사 응용 프로그램은 추가 외부 종속성을 피하기 위해 자체 명령 행 구문 분석을 롤링 할 수 있습니다. picocli 는 흥미로운 대안이 될 수 있습니다.
Picocli는 강력하고 사용자 친화적 인 GraalVM 지원 명령 줄 앱을 쉽게 구축 할 수있는 최신 라이브러리 및 프레임 워크입니다. 하나의 소스 파일에 있으므로 앱이 종속성을 추가하지 않도록 소스로 포함시킬 수 있습니다.
색상, 자동 완성, 부속 명령 등을 지원합니다. Groovy, Kotlin, Scala 등에서 사용 가능한 Java로 작성
풍모:
- 주석 기반 : 선언적 , 중복 방지 및 프로그래머 의도 표현
- 편리 성 : 사용자 입력을 구문 분석하고 한 줄의 코드로 비즈니스 로직을 실행
- 강력한 형식의 모든 것을 – 명령 줄 옵션뿐만 아니라 위치 매개 변수
- POSIX 클러스터 된 짧은 옵션 (
<command> -xvfInputFile
및<command> -x -v -f InputFile
) - 세밀하게 제어 : 최소, 최대 및 매개 변수의 개수를 허용하는 인수에 대응 모델, 예를 들면
"1..*"
,"3..5"
- 부속 명령 (임의의 깊이에 내포 될 수 있음)
- 풍부한 기능 : 구성 가능한 arg 그룹, 인용 된 arg 분할, 반복 가능한 하위 명령 등
- 사용자 친화적 : 사용 도움말 메시지는 색상을 사용하여 나머지 사용 도움말의 옵션 이름과 같은 중요한 요소를 대조 하여 사용자 의인지 부하 를 줄입니다.
- 앱을 GraalVM 기본 이미지 로 배포
- 작동 자바 5 이상
- 광범위하고 세심한 문서
사용법 도움말 메시지는 프로그래밍없이 주석으로 쉽게 사용자 정의 할 수 있습니다. 예를 들면 다음과 같습니다.
( 소스 )
사용 도움말 메시지가 표시되는 스크린 샷을 하나 더 추가하는 것에 저항 할 수 없었습니다. 사용 도움말은 응용 프로그램의 얼굴이므로 창의적이고 재미있게 보내십시오!
면책 조항 : 나는 picocli를 만들었습니다. 의견이나 질문은 매우 환영합니다.
답변
JOpt를 사용하고 꽤 편리하다는 것을 알았습니다 : http://jopt-simple.sourceforge.net/
첫 페이지에는 약 8 개의 대체 라이브러리 목록이 있으며, 확인하고 필요에 가장 적합한 라이브러리를 선택하십시오.
답변
누군가가 최근에 주석 기반의 args4j를 지적했습니다 . 난 정말 좋아!
답변
이것은 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
.
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));
}
}