2017-12-23 1 views
-3

기존 Java 프로젝트와 논쟁하고있는 순간, 저의 목표는 인수를 전달하고 실행하도록 명령 줄 인터페이스를 만드는 것입니다. 말하자면.터미널에서 실행되는 Java 프로그램에 대한 명령 줄 인터페이스 만들기

내가 지금처럼 Apache commons cli library을 사용하고 있습니다 : 이클립스에서

import org.apache.commons.cli.CommandLine; 
import org.apache.commons.cli.CommandLineParser; 
import org.apache.commons.cli.DefaultParser; 
import org.apache.commons.cli.HelpFormatter; 
import org.apache.commons.cli.Options; 
import org.apache.commons.cli.ParseException; 

public class CommandLineParameters { 

    public static void main(String[] args) { 
    CommandLineParser parser = new DefaultParser(); 
    Options options = new Options(); 

    options.addOption("a", "abc", true, "First Parameter"); 
    options.addOption("x", "xyz", true, "Second Parameter"); 
    options.addOption("h", "help", false, "Shows this Help"); 

    try { 
     CommandLine commandLine = parser.parse(options, args); 

     System.out.println(commandLine.getOptionValue("a")); 
     System.out.println(commandLine.getOptionValue("x")); 

     if (commandLine.hasOption("h")) { 
     HelpFormatter formatter = new HelpFormatter(); 
     formatter.printHelp("CommandLineParameters", options); 
     } 

    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

내가 Run Configurations...에 전달 된 Arguments 수정하여 실행할 수 있습니다, 그러나, 나는 사실 가 할 좋아 것이 무엇인지, 또는 ipconfig과 같은 "normal"터미널 프로그램과 유사한 방법으로 터미널 셸에서이 프로그램을 실행할 수 있습니다.

Java를 사용하면 어떻게 될까요?

참고 : 는 내가 명령 줄 프로그램에 인터페이스를 만들기 위해 노력하고있어, 명령 줄에서이 프로그램을 빌드/컴파일하려고 아니에요.

+0

일반적으로 프로젝트를 빌드하고 실행하는 디렉토리에 셸을 열어두면됩니다. – markspace

+1

명령 줄 구문 자체에 대해 묻는 경우 명령은 java 및 javaw이며 [설명서 페이지] (https://docs.oracle.com/javase/7/docs/)에 설명되어 있습니다. technotes/tools/windows/java.html) – markspace

+0

정확히 무엇을 의미하는지 확신 할 수 없습니다. 어떻게 할 지에 대한 리소스 방향을 알려주시겠습니까? –

답변

1

제공된 답변 java -jar 명령을 사용하여 실행할 수있는 단지를 구축하는 방법에 대해 설명합니다. 다음 문서에서는 이러한 '실행'항아리를 가지고 sh하여 '프로그램'파일을 실행으로 변환 (그래서 java -jar program.jar./program 호출하지 될 수있다)하는 방법에 대해 설명합니다 https://coderwall.com/p/ssuaxa/how-to-make-a-jar-file-linux-executable

을 생각은 zip이다 archive (jar은 기본적으로 zip 아카이브의 맛입니다)에는 임의의 프롤로그가있을 수 있습니다. 프롤로그는 파일 시작 부분부터 zip 파일 서명 (4 자, 처음 두 개는 'PK')까지입니다. java가 jar 아카이브를 읽으면 해당 프롤로그 (서명 이전의 모든 것)는 건너 뜁니다.

따라서 java의 관점에서, 그러한 jar는 유효한 jar가됩니다. 그러나 그 프롤로그가 쉘 스크립트이면, 그러한 jar 파일은 쉘 인터프리터를 사용하여 실행할 수있는 파일이됩니다.

즉, 동일한 jar 아카이브를 인수로 사용하여 java -jar을 호출하는 셸 스크립트로 보통의 jar 콘텐츠를 추가 할 수 있습니다. 그리고 java은 기꺼이 프롤로그를 무시하고 jar을 실행할 것입니다.

기사의 프롤로그는 다음과 같습니다

#!/bin/sh 
MYSELF=`which "$0" 2>/dev/null` 
[ $? -gt 0 -a -f "$0" ] && MYSELF="./$0" 
java=java 
if test -n "$JAVA_HOME"; then 
    java="$JAVA_HOME/bin/java" 
fi 
exec "$java" $java_args -jar $MYSELF "[email protected]" 
exit 1 

그것은 java를 검색하고 필요한 매개 변수를 시작합니다. 이것은 단지 예제 일 뿐이므로 java 명령을 찾는 데 사용되는 알고리즘을 조정하여 필요에 맞게 만들 수 있습니다.

결과 파일은이 런처 쉘 스크립트와 java -jar을 사용하여 실행해야하는 jar 파일 (주 클래스 및 매니페스트 포함)의 연결로 구성됩니다.

1

나는 당신의 더 나은 옵션이 CLI args를 받아들이 기 위해 기존 프로그램의 다른 메인 메소드를 재 작성하는 것이라고 생각하지만, 그렇게하고 싶다면, 프로그램을 클래스 나 jar 파일로 컴파일해야한다.

그리고 CLI에서 다른 Java 프로그램처럼 실행하지만 여기에 -h과 같은 인수를 지정하십시오. 참고 : Apache Commons 용 클래스 경로를 여기에 포함시켜야합니다.

java - cp <classpath> fully.qualified.CommandLineParameters -h 

또는, 매니페스트 및 낙선자 포함 아파치 코 몬즈의 메인 클래스의 속성을 가진 JAR이있는 경우, 클래스 이름이나 클래스 경로를 설정할 필요가 없습니다. 여전히 논쟁을하십시오.

java -jar jarFile.jar -h 

는 내가 명령 줄에서 액세스 독립적 인 프로그램,

같은 ls이 bashrc에와 put in an alias or function를 열고되고 싶어요. 문제의 사실은 당신이 java 호출해야합니다, 또는 당신은 멋져요

같이 확인 가능하다
$ cat my-ls 
#!/usr/bin/env groovy 
println "Run my other program" 

$ chmod +x my-ls 
$ ./my-ls 
Run my other program 
+0

그것은 내가 의미하는 것이 아닙니다. 나는 그것이'ls와 같은 커맨드 라인으로부터 접근되는 독립적 인 프로그램이되기를 원한다. –

+0

자바는 잘못된 프로그래밍 언어이다 ... 아니면 별칭을 –

0

을 다른 JVM 스크립트 언어를 사용할 수있다. 매개 변수를 구문 분석 한 후 System.in에서 읽고 System.out에 쓸 수 있습니다.

package sf; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

public class Sample { 

    public static void main(String[] args) { 
     processArguments(args); 
     try { 
      processInput(System.in); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private static void processArguments(String[] args) { 
     // whatever 
    } 

    private static void processInput(InputStream in) throws IOException { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      System.out.println(line.toUpperCase()); 
     } 
     in.close(); 
    } 
} 

하고 그냥

java sf.Sample -a <input.txt >out.txt 

디렉토리와 같은 형식을 사용 실행 - 여기 아주 간단한 샘플을 대문자로 입력을 변환하는 불완전 (오류 처리 등), 단지 시작하는 방법을 보여 Sample.class이있는 sf 디렉토리가있는 디렉토리를 CLASSPATH에 두거나 java 명령에 -cp 옵션을 사용해야합니다 (How Classes are Found).

+0

으로 만들면 그것이 의미하는 바가 아니다. 명령 줄에서 액세스 할 수있는 독립적 인 프로그램 (예 :'ls')이 필요합니다. –

+1

@ s.matthew.english "java -jar"를 입력하지 않으려는 것입니까? JVM 인터프리터를 호출해야한다. – markspace

+0

그냥 명령 줄에서 호출 할 수있는 정상적인 프로그램이되고 싶습니다. * 가능해야합니다. –

0

당신은 당신의 자바 코드에서 실행 항아리를 만들어야합니다 : 이클립스 오른쪽에서

  1. 이 양식을 작성하여 기본 파일
  2. 선택 내보내기 -> excecutable jar 파일을 클릭합니다. 명령 줄에서 응용 프로그램을 시작

    테스트

에서 "실행 구성"실행중인 구성에 보자

java -jar CommandLineParameters.jar --param1 -param2 ... 
+0

내 bash 프로필 안에 내 경로 에이 항아리를 추가 할 수있는 몇 가지 방법입니다 그리고 난 그냥'ls' 또는'grep' 수있는 것처럼 터미널에서 noramally 전화? –

+0

예. classpath를 정의해야한다. https://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html – slawek

관련 문제