수색…


통사론

  • java [ <opt> ... ] <class-name> [ <argument> ... ]

  • java [ <opt> ... ] -jar <jar-file-pathname> [ <argument> ... ]

비고

java 명령은 명령 행에서 Java 어플리케이션을 실행하는 데 사용됩니다. Java SE JRE 또는 JDK의 일부로 사용할 수 있습니다.

Windows 시스템에는 java 명령의 두 가지 변형이 있습니다.

  • java 변형은 새 콘솔 창에서 응용 프로그램을 실행합니다.
  • javaw 변형은 새 콘솔 창을 만들지 않고 응용 프로그램을 시작합니다.

다른 시스템 (예 : Linux, Mac OSX, UNIX)에서는 java 명령 만 제공되며 새 콘솔 창을 시작하지 않습니다.

구문의 <opt> 기호는 java 명령 행의 옵션을 나타냅니다. "Java Options"및 "Heap and stack sizing options"주제는 가장 일반적으로 사용되는 옵션을 다룹니다. 기타 내용은 JVM Flags 주제에서 다룹니다.

실행 가능한 JAR 파일 실행하기

실행 가능한 JAR 파일은 Java 코드를 실행 가능한 단일 파일로 어셈블하는 가장 간단한 방법입니다. * (편집자 주 : JAR 파일의 작성은 별도의 주제로 다루어야합니다.) *

경로명이 <jar-path> 인 실행 가능한 JAR 파일이 있다고 가정하면 다음과 같이 실행할 수 있습니다.

java -jar <jar-path>

명령에 명령 행 인수가 필요한 경우 <jar-path> 뒤에 명령 행 인수를 추가하십시오. 예 :

java -jar <jar-path> arg1 arg2 arg3

java 명령 행에서 추가 JVM 옵션을 제공해야하는 경우, -jar 옵션 이전 에 이동 해야 합니다. -jar 를 사용하면 -cp / -classpath 옵션이 무시됩니다. 응용 프로그램의 클래스 경로는 JAR 파일 매니페스트에 의해 결정됩니다.

"main"클래스를 통해 Java 애플리케이션 실행하기

응용 프로그램이 실행 가능 JAR로 패키징되지 않은 경우 java 명령 행에 진입 점 클래스 의 이름을 제공해야합니다.

HelloWorld 클래스 실행하기

"HelloWorld"예제는 새 Java 프로그램 작성에 설명되어 있습니다 . 엔트리 포인트에 대한 요구 사항을 충족시키는 HelloWorld 라는 단일 클래스로 구성됩니다.

(컴파일 된) "HelloWorld.class"파일이 현재 디렉토리에 있다고 가정하면 다음과 같이 시작할 수 있습니다.

java HelloWorld

주목해야 할 중요한 사항은 다음과 같습니다.

  • ".class"파일 또는 ".java"파일의 경로 이름이 아닌 클래스 이름을 제공해야합니다.
  • 패키지에서 클래스가 선언되면 (대부분의 Java 클래스가 java 명령에 제공하는 클래스 이름은 전체 클래스 이름이어야합니다. 예를 들어 SomeClasscom.example 패키지에서 선언 된 경우 전체 클래스 이름은 com.example.SomeClass 됩니다.

클래스 경로 지정

java -jar 명령 구문에서 사용하지 않는 한 java 명령은 클래스 경로를 검색하여로드 할 클래스를 찾습니다. 클래스 패스를 참조하십시오. 위의 명령은 현재 클래스가 포함 된 기본 클래스 경로 (또는 포함)에 의존합니다. -cp 옵션을 사용하여 클래스 경로를 지정 -cp 에 대해 더 명확히 할 수 있습니다.

java -cp . HelloWorld

이것은 현재 디렉토리 ( "."가 참조하는 것)를 클래스 경로의 유일한 항목으로 만드는 것입니다.

-cpjava 명령에 의해 처리되는 옵션입니다. java 명령을위한 모든 옵션은 classname 앞에 있어야합니다. 클래스 뒤의 모든 것은 Java 어플리케이션의 커맨드 라인 인수로 취급되며, main 메소드에 전달 된 String[] 어플리케이션으로 전달됩니다.

(어떤 경우 -cp 옵션이 제공되지는 java 에 의해 주어진 클래스 패스 사용 CLASSPATH 환경 변수를. 그 변수가 설정 또는 비어있는 경우, java 사용하는 "."기본 클래스 경로로.)

진입 점 클래스

Java 진입 점 클래스에는 다음과 같은 서명 및 한정자가있는 main 메소드가 있습니다.

public static void main(String[] args)

Sidenote : 배열이 작동하는 방식 때문에, (String args[])

java 명령이 가상 시스템을 시작하면 지정된 진입 점 클래스를로드하고 main 을 찾으려고 시도합니다. 성공하면 명령 행의 인수가 Java String 객체로 변환되고 배열로 어셈블됩니다. 경우 main 다음과 같이 호출, 배열은되지 않습니다 null 및 포함되지 않습니다 null 항목을.

유효한 진입 점 클래스 방법은 다음을 수행해야합니다.

  • main (대소 문자 구별)
  • publicstatic
  • void 반환 유형 지정
  • 배열 String[] 이있는 단일 인수가 있어야합니다. 인수가 있어야하며 하나 이상의 인수가 허용되지 않습니다.
  • 일반 사항 : 유형 매개 변수가 허용되지 않습니다.
  • 비 - 제네릭 최상위 수준 (중첩되지 않거나 내부 클래스)의 클래스가 있어야합니다.

클래스를 public 로 선언하는 것은 일반적이지만 꼭 필요한 것은 아닙니다. Java 5 이후부터는 main 메소드의 인수 유형이 문자열 배열 대신 String varargs가 될 수 있습니다. main 은 선택적으로 예외를 throw 할 수 있으며 매개 변수의 이름은 아무거나 지정할 수 있지만 일반적으로 args 입니다.

JavaFX 진입 점

Java 8 이후부터 java 명령을 사용하여 JavaFX 응용 프로그램을 직접 시작할 수도 있습니다. JavaFX는 JavaFX 태그에 설명되어 있지만 JavaFX 진입 점은 다음을 수행해야합니다.

  • javafx.application.Application 확장
  • public 되고 abstract 아니 abstract
  • 일반 또는 중첩되지 않음
  • 명시 적 또는 암시 적 public no-args 생성자가 있어야합니다.

'java'명령 문제 해결

이 예제는 'java'명령을 사용하여 일반적인 오류를 다룹니다.

"명령어를 찾을수 없음"

다음과 같은 오류 메시지가 표시되면 :

java: command not found

java 명령을 실행할 때, 이것은 쉘의 명령 탐색 경로에 java 명령이 없음을 의미합니다. 원인은 다음과 같습니다.

  • Java JRE 또는 JDK가 전혀 설치되어 있지 않습니다.
  • 쉘 초기화 파일에서 (정확하게) PATH 환경 변수를 갱신하지 않았거나,
  • 현재 셸에서 관련 초기화 파일을 "소스 화"하지 않았습니다.

수행해야하는 단계는 : Java 설치; 를 참조하십시오.

"메인 클래스를 찾거나로드 할 수 없습니다"

이 오류 메시지는 사용자가 지정한 진입 점 클래스를 찾거나로드 할 수없는 경우 java 명령에 의해 출력됩니다. 일반적으로 이런 일이 발생할 수있는 세 가지 큰 이유가 있습니다.

  • 존재하지 않는 진입 점 클래스를 지정했습니다.
  • 클래스가 있지만 잘못 지정했습니다.
  • 클래스가 존재하고 올바르게 지정했지만 classpath가 올바르지 않기 때문에 Java에서 찾을 수 없습니다.

다음은 문제를 진단하고 해결하는 절차입니다.

  1. 진입 점 클래스의 전체 이름을 찾습니다.

    • 클래스에 대한 소스 코드가있는 경우 전체 이름은 패키지 이름과 단순 클래스 이름으로 구성됩니다. "Main"클래스가 "com.example.myapp"패키지에 선언 된 인스턴스는 전체 이름이 "com.example.myapp.Main"입니다.
    • 컴파일 된 클래스 파일을 가지고 있다면 javap 을 실행하여 클래스 이름을 찾을 수 있습니다.
    • 클래스 파일이 디렉토리에 있으면 디렉토리 이름에서 전체 클래스 이름을 유추 할 수 있습니다.
    • 클래스 파일이 JAR 또는 ZIP 파일에있는 경우 JAR 또는 ZIP 파일의 파일 경로에서 전체 클래스 이름을 유추 할 수 있습니다.
  2. java 명령의 오류 메시지를보십시오. 메시지는 java 가 사용하려고하는 전체 클래스 이름으로 끝나야합니다.

    • 진입 점 클래스의 전체 클래스 이름과 정확하게 일치하는지 확인하십시오.
    • ".java"또는 ".class"로 끝나지 않아야합니다.
    • 슬래시 또는 Java 식별자 1 에서 유효하지 않은 다른 문자를 포함해서는 안됩니다 1 .
    • 이름의 대소 문자가 전체 클래스 이름과 정확하게 일치해야합니다.
  3. 올바른 클래스 이름을 사용하는 경우 클래스가 실제로 클래스 경로에 있는지 확인하십시오.

    • 클래스 이름이 매핑되는 경로명을 찾아 낸다. 경로 이름에 클래스 이름 매핑을 참조하십시오.
    • classpath가 무엇인지 생각해냅니다. 이 예제를 보라 : 클래스 패스를 지정하는 다른 방법들
    • classpath에있는 각각의 JAR과 ZIP 파일을보고 필요한 경로명을 가진 클래스가 있는지 확인하십시오.
    • 각 디렉토리를보고 경로 이름이 디렉토리 내의 파일로 해석되는지 확인하십시오.

직접 클래스 패스를 검사해도 문제가 발견되지 않으면 -Xdiag-XshowSettings 옵션을 추가 할 수 있습니다. 전자는로드 된 모든 클래스를 나열하고 후자는 JVM에 대한 유효한 클래스 경로를 포함하는 설정을 인쇄합니다.

마지막으로,이 문제에 대한 약간의 불명확 한 원인이 있습니다.

  • 존재하지 않는 클래스를 지정하는 Main-Class 속성을 가진 실행 가능한 JAR 파일.
  • 올바르지 않은 Class-Path 속성을 가진 실행 가능한 JAR 파일.
  • classname 앞에 옵션 2 개 를 엉망으로 만들면 java 명령은 그 중 하나를 클래스 이름으로 해석하려고 시도 할 수 있습니다.
  • 누군가가 Java 스타일 규칙을 무시하고 대소 문자 만 다른 패키지 또는 클래스 식별자를 사용하고 파일 이름의 대소 문자를 중요하지 않은 것으로 취급하는 플랫폼에서 실행중인 경우
  • 코드 또는 명령 줄의 클래스 이름에 동형 문자가있는 문제입니다.

"주 메소드가 클래스 <이름>에 없습니다"

이 문제점은 java 명령이 사용자가 지정한 클래스를 찾아로드 할 수 있지만 엔트리 포인트 메소드를 찾을 수없는 경우 발생합니다.

세 가지 가능한 설명이 있습니다.

  • 실행 가능한 JAR 파일을 실행하려고하면 JAR의 매니페스트에 올바른 진입 점 클래스가 아닌 클래스를 지정하는 잘못된 "Main-Class"속성이 있습니다.
  • 진입 점 클래스가 아닌 클래스에 java 명령을 전달했습니다.
  • 진입 점 클래스가 잘못되었습니다. 자세한 내용은 진입 점 클래스 를 참조하십시오.

기타 리소스


1 - Java 8 이상부터 java 명령은 파일 이름 분리 자 ( "/"또는 "")를 마침표 ( ".")에 유용하게 매핑합니다. 그러나이 문제는 설명서 페이지에 설명되어 있지 않습니다.

2 - 텍스트 편집기가 일반 하이픈 대신 "긴 하이픈"을 사용하는 서식이 지정된 문서에서 명령을 복사하여 붙여 넣는 경우가 매우 드문 경우입니다.

라이브러리 종속성을 사용하여 Java 응용 프로그램 실행

이것은 "main class""executable JAR" 예제의 연속입니다.

일반적인 Java 응용 프로그램은 응용 프로그램 관련 코드와 구현하거나 타사에서 구현 한 다양한 재사용 가능한 라이브러리 코드로 구성됩니다. 후자는 일반적으로 라이브러리 종속성이라고하며 일반적으로 JAR 파일로 패키지됩니다.

Java는 동적으로 결합 된 언어입니다. 라이브러리 의존성이있는 Java 애플리케이션을 실행할 때 JVM은 필요에 따라 클래스를로드 할 수 있도록 종속성의 위치를 ​​알아야합니다. 대체로 말하자면,이 문제를 해결할 수있는 두 가지 방법이 있습니다.

  • 응용 프로그램 및 해당 종속성은 필요한 모든 클래스 및 자원을 포함하는 단일 JAR 파일로 다시 패키징 할 수 있습니다.

  • 런타임 클래스 경로를 통해 종속 JAR 파일을 찾을 위치를 JVM에 알릴 수 있습니다.

실행 가능한 JAR 파일의 경우 런타임 클래스 경로는 "Class-Path"매니페스트 속성에 의해 지정됩니다. (편집자 주 : jar 명령의 별도 주제에서 설명해야합니다.) 그렇지 않으면 런타임 클래스 경로를 -cp 옵션을 사용하거나 CLASSPATH 환경 변수를 사용하여 제공해야합니다.

예를 들어, 엔트리 포인트 클래스가 com.example.MyApp 인 "myApp.jar"파일에 Java 응용 프로그램이 있다고 가정합니다. 응용 프로그램이 라이브러리 JAR 파일 "lib / library1.jar"및 "lib / library2.jar"에 종속되어 있다고 가정합니다. 명령 줄에서 다음과 같이 java 명령을 사용하여 응용 프로그램을 시작할 수 있습니다.

$ # Alternative 1 (preferred)
$ java -cp myApp.jar:lib/library1.jar:lib/library2.jar com.example.MyApp

$ # Alternative 2
$ export CLASSPATH=myApp.jar:lib/library1.jar:lib/library2.jar
$ java com.example.MyApp

(Windows에서는 classpath 구분 기호로 : 대신에 ; 를 사용하고 export 대신 set 사용하여 (로컬) CLASSPATH 변수를 set 합니다.)

Java 개발자는 이와 같이 편안하지만 "사용자에게 친숙하지"않습니다. 따라서 간단한 쉘 스크립트 (또는 Windows 배치 파일)를 작성하여 사용자가 알 필요가없는 세부 사항을 숨기는 것이 일반적입니다. 예를 들어, 다음 쉘 스크립트를 "myApp"라는 파일에 넣고 실행할 수있게 만든 다음 명령 검색 경로의 디렉토리에 넣습니다.

#!/bin/bash
# The 'myApp' wrapper script

export DIR=/usr/libexec/myApp
export CLASSPATH=$DIR/myApp.jar:$DIR/lib/library1.jar:$DIR/lib/library2.jar
java com.example.MyApp

다음과 같이 실행할 수 있습니다.

$ myApp arg1 arg2 ...

명령 행에서의 모든 인수는 "$@" 확장을 통해 Java 응용 프로그램에 전달됩니다. (구문은 다르지만 Windows 배치 파일과 비슷한 기능을 수행 할 수 있습니다.)

인수에있는 공백 및 기타 특수 문자

우선, 인수에서 공백을 처리하는 문제는 실제로 Java 문제가 아닙니다. 그보다는 Java 프로그램을 실행할 때 사용하는 명령 쉘이 처리해야하는 문제점입니다.

예를 들어 파일의 크기를 출력하는 다음과 같은 간단한 프로그램이 있다고 가정 해 보겠습니다.

import java.io.File;

public class PrintFileSizes {
    
    public static void main(String[] args) {
        for (String name: args) {
            File file = new File(name);
            System.out.println("Size of '" + file + "' is " + file.size());
        }
    }
}

이제 경로 이름에 공백이있는 파일의 크기를 출력하고 싶다고 가정 해보십시오. 예 : /home/steve/Test File.txt . 다음과 같이 명령을 실행하면 :

$ java PrintFileSizes /home/steve/Test File.txt

쉘은 /home/steve/Test File.txt 가 실제로 하나의 경로 이름인지 여부를 알 수 없습니다. 대신 Java 응용 프로그램에 두 개의 별개의 인수를 전달합니다. Java 응용 프로그램은 해당 파일 크기를 찾기 위해 시도하고 해당 경로가있는 파일 (아마도)이 없기 때문에 실패합니다.

POSIX 셸을 사용하는 솔루션

POSIX 쉘을 포함 sh 등뿐만 아니라 유도체 bashksh . 이 셸 중 하나를 사용하는 경우 인수를 인용 하여 문제를 해결할 수 있습니다.

$ java PrintFileSizes "/home/steve/Test File.txt"

경로 이름 주위의 큰 따옴표는 쉘에게 단일 인수로 전달되어야 함을 알려줍니다. 이 경우 따옴표가 제거됩니다. 이 작업을 수행하는 몇 가지 다른 방법이 있습니다.

$ java PrintFileSizes '/home/steve/Test File.txt'

단일 (직선) 따옴표는 인수 내에서 다양한 확장을 억제한다는 점을 제외하면 큰 따옴표로 처리됩니다.

$ java PrintFileSizes /home/steve/Test\ File.txt

백 슬래시는 다음 공백을 이스케이프하여 인수 분리 문자로 해석되지 않게합니다.

인수에서 다른 특수 문자를 다루는 방법을 포함한보다 포괄적 인 문서는 Bash 문서의 인용 항목 을 참조하십시오.

Windows 용 솔루션

Windows의 근본적인 문제는 OS 수준에서 인수가 단일 문자열 ( 소스 )로 하위 프로세스에 전달된다는 것입니다. 즉, 명령 줄 구문 분석 (또는 다시 구문 분석)의 궁극적 인 책임은 프로그램이나 런타임 라이브러리 중 하나에 해당합니다. 불일치가 많이 있습니다.

Java의 경우 짧은 이야기를 짧게 자르기 :

  • java 커맨드에서 인자 주위에 큰 따옴표를 넣으면 공백이있는 인자를 전달할 수 있습니다.

  • 분명히 java 명령 자체가 명령 문자열을 구문 분석하고 있습니다.

  • 그러나 배치 파일에서 SET 및 변수 대체를 사용하여이를 결합하려고하면 큰 따옴표가 제거되는지 여부가 실제로 복잡해집니다.

  • cmd.exe 셸에는 다른 이스케이프 메커니즘이 있습니다. 이중 따옴표를 두배로하고 ^ escapes를 사용합니다.

자세한 내용은 배치 파일 설명서를 참조하십시오.

Java 옵션

java 명령은 다양한 옵션을 지원합니다.

  • 모든 옵션은 단일 하이픈 또는 마이너스 기호 ( - )로 시작합니다. "긴"옵션에 대해 -- 를 사용하는 GNU / Linux 규약은 지원되지 않습니다.

  • 옵션을 인식하려면 <classname> 또는 -jar <jarfile> 인수 앞에 와야합니다. 그 뒤에 나오는 인수는 실행중인 Java 응용 프로그램에 전달할 인수로 처리됩니다.

  • -X 또는 -XX 로 시작하지 않는 옵션은 표준 옵션입니다. 표준 옵션을 지원하기 위해 모든 Java 구현 1 을 의지 할 수 있습니다.

  • -X 로 시작하는 옵션은 비표준 옵션이며 한 Java 버전에서 다음 버전으로 철회 될 수 있습니다.

  • -XX 로 시작하는 옵션은 고급 옵션이며 철회 될 수도 있습니다.

-D 하여 시스템 등록 정보 설정

-D<property>=<value> 옵션은 시스템 Properties 개체의 속성을 설정하는 데 사용됩니다. 이 매개 변수는 다른 속성을 설정하기 위해 반복 될 수 있습니다.

메모리, 스택 및 가비지 수집기 옵션

힙 및 스택 크기를 제어하기위한 주요 옵션 은 힙, PermGen 및 스택 크기 설정에 설명되어 있습니다. (편집자 주 : 가비지 컬렉터 옵션은 동일한 주제로 설명해야합니다.)

어설 션 사용 가능 및 사용 불가능

-ea-da 옵션은 각각 Java assert 검사를 활성화 및 비활성화합니다.

  • 모든 어설 션 검사는 기본적으로 사용되지 않습니다.
  • -ea 옵션을 사용하면 모든 어설 션을 검사 할 수 있습니다.
  • -ea:<packagename>... 패키지 및 모든 하위 패키지에서 어설 션을 검사 할 수 있습니다.
  • -ea:<classname>... 의 어설 션을 검사 할 수 있습니다.
  • -da 옵션은 모든 어설 션 검사를 비활성화합니다.
  • -da:<packagename>... 은 패키지 및 모든 하위 패키지에서 어설 션을 검사 할 수 없도록합니다.
  • -da:<classname>... 의 어설 션 검사를 사용하지 않습니다.
  • -esa 옵션을 사용하면 모든 시스템 클래스를 검사 할 수 있습니다.
  • -dsa 옵션은 모든 시스템 클래스 검사를 비활성화합니다.

옵션을 결합 할 수 있습니다. 예를 들어.

$ # Enable all assertion checking in non-system classes 
$ java -ea -dsa MyApp

$ # Enable assertions for all classes in a package except for one.
$ java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat MyApp

단언 검사를 가능하게하면 Java 프로그래밍의 동작이 변경 될 가능성이 있습니다.

  • 일반적으로 응용 프로그램을 느리게 만드는 경우가 있습니다.
  • 특정 메서드를 실행하는 데 시간이 오래 걸릴 수 있으며 이로 인해 다중 스레드 응용 프로그램에서 스레드의 타이밍이 변경 될 수 있습니다.
  • 그것은 뜻밖의 일이-전에 메모리에 이상이 사라 발생할 수 있습니다 관계를 소개 할 수 있습니다.
  • 잘못 구현 된 assert 문에는 원치 않는 부작용이있을 수 있습니다.

VM 유형 선택

-client-server 옵션을 사용하면 두 가지 형태의 HotSpot VM 중에서 선택할 수 있습니다.

  • "클라이언트"양식은 사용자 응용 프로그램 용으로 조정되어보다 빠른 시작을 제공합니다.
  • "서버"양식은 장기간 실행되는 응용 프로그램을 위해 조정됩니다. JVM 컴파일러가 원시 코드 최적화 작업을보다 잘 수행 할 수있게 해주는 JVM "warm up"중에 캡처 통계가 오래 걸립니다.

기본적으로 JVM은 플랫폼의 기능에 따라 가능하면 64 비트 모드로 실행됩니다. -d32-d64 옵션은 명시 적으로 모드를 선택할 수 있습니다.


1 - java 명령에 대한 공식 매뉴얼을 확인하십시오. 때때로 표준 옵션은 "변경 대상"으로 설명됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow