Java에서 명령 줄 인수를 어떻게 구문 분석합니까? 명령 행 인수를

Java에서 명령 행 인수를 구문 분석하는 좋은 방법은 무엇입니까?



답변

이것들을 확인하십시오 :

또는 자신의 롤 :


예를 들어 다음은 commons-cli2 개의 문자열 인수를 구문 분석 하는 방법입니다 .

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를 살펴보십시오 .

나는 그것을 만들었다. 질문이나 기능 요청을 받겠습니다.


답변


답변

그것은 Commons CLI보다 더 나은 시간을 2020입니다 … 🙂

자체 Java 명령 행 구문 분석기를 빌드하거나 라이브러리를 사용해야합니까?

많은 작은 유틸리티 유사 응용 프로그램은 추가 외부 종속성을 피하기 위해 자체 명령 행 구문 분석을 롤링 할 수 있습니다. picocli 는 흥미로운 대안이 될 수 있습니다.

Picocli는 강력하고 사용자 친화적 인 GraalVM 지원 명령 줄 앱을 쉽게 구축 할 수있는 최신 라이브러리 및 프레임 워크입니다. 하나의 소스 파일에 있으므로 앱이 종속성을 추가하지 않도록 소스로 포함시킬 수 있습니다.

색상, 자동 완성, 부속 명령 등을 지원합니다. Groovy, Kotlin, Scala 등에서 사용 가능한 Java로 작성

ANSI 색상에 대한 최소한의 사용 도움말

풍모:

  • 주석 기반 : 선언적 , 중복 방지 및 프로그래머 의도 표현
  • 편리 성 : 사용자 입력을 구문 분석하고 한 줄의 코드로 비즈니스 로직을 실행
  • 강력한 형식의 모든 것을 – 명령 줄 옵션뿐만 아니라 위치 매개 변수
  • 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));
  }

}

https://github.com/pcj/google-options