Java에서 명령 줄 인수를 어떻게 구문 분석합니까?
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
최신 JCommander를 살펴보십시오 .
나는 그것을 만들었다. 질문이나 기능 요청을 받겠습니다.
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 색상 사용 도움말과 자동 완성 기능이 있습니다
JOpt를 사용하고 꽤 편리하다는 것을 알았습니다 : http://jopt-simple.sourceforge.net/
프론트 페이지에는 또한 약 8 개의 대체 라이브러리 목록이 있으며,이를 확인한 후 필요에 가장 적합한 라이브러리를 선택하십시오.
누군가가 최근에 주석 기반의 args4j를 지적했습니다 . 난 정말 좋아!
구매 또는 구축?
많은 작은 유틸리티 유사 응용 프로그램은 추가 외부 종속성을 피하기 위해 자체 명령 행 구문 분석을 롤링 할 수 있습니다.
피코 클리 는 흥미로울 수 있습니다. 항아리를 uberjar로 음영 처리하는 간단한 대안으로 소스로 포함되도록 설계되었습니다.
다른 기능은 색상 사용 도움말입니다.
파서 기능 :
- 주석 기반 : 파싱은 한 줄의 코드
- 명령 줄 옵션 및 위치 매개 변수
- POSIX 클러스터 된 짧은 옵션 (
<command> -xvfInputFile
및<command> -x -v -f InputFile
) - 파라미터의 최소값, 최대 값 및 가변 수 있도록하는 인수에 대응 모델, 예를 들면
"1..*"
,"3..5"
- 부속 명령 (임의의 깊이에 내포 될 수 있음)
- Java 5 이상에서 작동
사용법 도움말 메시지는 프로그래밍없이 주석으로 쉽게 사용자 정의 할 수 있습니다. 예를 들면 다음과 같습니다.
( 소스 )
사용 도움말 메시지가 무엇인지 보여주기 위해 스크린 샷을 하나 더 추가하는 것에 저항 할 수 없었습니다. 사용 도움말은 응용 프로그램의 얼굴이므로 창의적이고 재미있게 보내십시오!
면책 조항 : 나는 picocli를 만들었습니다. 의견이나 질문은 매우 환영합니다.
이것은 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));
}
}
https://github.com/pcj/google-options
Commons CLI 프로젝트를 살펴보십시오 .
응
나는 당신이 다음과 같은 것을 찾고 있다고 생각합니다 : http://commons.apache.org/cli
Apache Commons CLI 라이브러리는 명령 행 인터페이스 처리를위한 API를 제공합니다.
아마도 이것들
Java 용 JArgs 명령 행 옵션 구문 분석 스위트 -이 작은 프로젝트는 Java 프로그래머의 사용을 위해 편리하고 컴팩트하며 사전 패키지화되고 포괄적으로 문서화 된 명령 행 옵션 구문 분석기 스위트를 제공합니다. 처음에는 GNU 스타일 'getopt'와 호환되는 구문 분석이 제공됩니다.
ritopt, Java 용 Ultimate Options Parser- 여러 명령 행 옵션 표준이 제안되었지만 ritopt는 opt 패키지에 규정 된 규칙을 따릅니다.
이 불행의 메타 기사는 점프 오프 포인트로 흥미로울 것입니다.
http://furiouspurpose.blogspot.com/2008/07/command-line-parsing-libraries-for-java.html
나는 또 하나를 썼다 : 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
항공사 @ Github 가 좋아 보인다. 주석을 기반으로하며 Git 명령 행 구조를 에뮬레이트하려고합니다.
나는 여기에있는 대부분의 사람들이 내 방식을 싫어하는 이유를 천만 가지의 이유를 발견 할 것입니다. 나는 일을 간단하게 유지하고 싶기 때문에 '='를 사용하여 키와 값을 분리하고 다음과 같이 HashMap에 저장합니다.
Map<String, String> argsMap = new HashMap<>();
for (String arg: args) {
String[] parts = arg.split("=");
argsMap.put(parts[0], parts[1]);
}
사용자가 인수를 잊었거나 잘못된 인수를 사용한 경우 사용자를 돕기 위해 항상 예상 인수로 목록을 유지할 수 있습니다. 그러나 너무 많은 기능을 원할 경우이 솔루션은 어쨌든 적합하지 않습니다.
쓰레드 안전하지 않기 때문에 Apache Common CLI 라이브러리를 사용하지 않는 것이 좋습니다. 정적 변수 및 메소드와 함께 상태 저장 클래스를 사용하여 내부 작업 (예 : OptionBuilder)을 수행하며 단일 스레드 강력하게 제어되는 상황에서만 사용해야합니다.
가볍고 (jar size ~ 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);
}
내가 찾은 것이 Argparse4j가 최고입니다. 그것은 매우 편리하고 강력한 파이썬의 argparse 라이브러리를 모방합니다.
이미 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;
// ...
}
앞에서 언급 한 의견 중 하나 ( 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 (동일한 기능의 JOP 구현). Spring의 장점은 명령 행 인수를 속성에 직접 바인딩 할 수 있다는 것입니다. 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
'development' 카테고리의 다른 글
렌더링 후 입력에 초점 설정 (0) | 2020.02.10 |
---|---|
Naive Bayes 분류에 대한 간단한 설명 (0) | 2020.02.10 |
screenX / Y, clientX / Y 및 pageX / Y의 차이점은 무엇입니까? (0) | 2020.02.10 |
HTML 테이블에서 자동 줄 바꿈 (0) | 2020.02.10 |
C #에서 Java의 final과 동등한 것은 무엇입니까? (0) | 2020.02.10 |