준호씨의 블로그

apache commons cli 로 command line argument option 사용하기 본문

개발이야기

apache commons cli 로 command line argument option 사용하기

준호씨 2016. 3. 17. 01:03
반응형
리눅스 쉘 커맨드들을 사용할 때 다음과 같이 옵션을 넣어서 사용 하곤 한다.
command --host=junho85.pe.kr --port=25

java 에서도 구현 할 수 있는데 그냥 main 의 args 값을 바로 쓰려면 좀 불편하다. args 를 좀 편리하게 사용 할 수 있도록 apache commons cli 에서 기능을 제공해 주고 있다.

현재 최신 버전인 1.3.1 을 사용했고 사용방법은 대략 다음과 같다.
// ex) --host=mail.test.com --port=25
CommandLineParser parser = new DefaultParser();

Options options = new Options();
options.addOption(Option.builder().longOpt("host")
        .desc("smtp server host")
        .hasArg()
        .build());

options.addOption(Option.builder().longOpt("port")
        .desc("smtp server port")
        .hasArg()
        .build());

CommandLine line = parser.parse(options, args);

String host = line.getOptionValue("host");
String port = line.getOptionValue("port");

일단 addOption 으로 옵션을 추가 해 줘야 한다. 없는 옵션이 들어오면 오류가 발생한다.

참고해본 문서는 다음과 같다.

그런데 1.3 부터 deprecated 된 기능들이 많은데 문서는 아직 1.3 이전 기준으로 되어 있는지 deprecated 된 함수들을 사용한 예제들이 있다는게 좀 난감하다. 예를 들면 OptionBuilder 같은 것들. OptionBuidler 대신 Option.builder() 를 사용해야 하고 사용방법이 일부 다르니 주의 해야 한다.

parser 는 DefaultParser 외에 GnuParser 등등이 있는데 리눅스쉘 기반에서는 GnuParser 가 좀 더 적합할 것 같은데 deprecated 되었다.

또 좀 이상한 건
options.addOption("h", "host", false, "smtp server host");
options.addOption(Option.builder().longOpt("host")
        .desc("smtp server host")
        .hasArg()
        .build());
가 거의 똑같이 동작할 거 같은데 실제로는 그렇지 않았다.
--host=abc 처럼 사용하고 싶지만 전자는 안되고 후자는 된다.
왜 그럴까? 자세한 걸 확인 해 보고 싶지만 지금 당장 중요한 문제는 아니라 생략한다. 일단 후자로는 잘 되니 후자로 해야 겠다.

일단 작성한 예제는 https://github.com/junho85/java_study/blob/master/src/main/java/Mail.java 에 있다. 위치가 변경 될 수도 있으니 주의.
반응형
Comments