Java Language
자바 컴파일러 - 'javac'
수색…
비고
javac
명령은 Java 소스 파일을 바이트 코드 파일로 컴파일하는 데 사용됩니다. 바이트 코드 파일은 플랫폼에 독립적입니다. 즉, 한 종류의 하드웨어 및 운영 체제에서 코드를 컴파일 한 다음 Java를 지원하는 다른 플랫폼에서 코드를 실행할 수 있습니다.
javac
명령은 Java Development Kit (JDK) 배포판에 포함되어 있습니다.
Java 컴파일러와 나머지 표준 Java 툴체인은 코드에 다음과 같은 제한을 설정합니다.
- 소스 코드는 접미사 ".java"
- 바이트 코드는 접미사 ".class"가있는 파일에 보관됩니다.
- 파일 시스템의 소스 및 바이트 코드 파일의 경우 파일 경로 이름은 패키지 및 클래스 이름을 반영해야합니다.
참고 : javac
컴파일러를 바이트 코드를 원시 코드로 컴파일하는 JIT (Just in Time) 컴파일러 와 혼동해서는 안됩니다.
'javac'명령 - 시작하기
간단한 예
"HelloWorld.java"에 다음 Java 소스가 포함되어 있다고 가정합니다.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
(위의 코드에 대한 설명은 Java 언어 시작하기 를 참조하십시오.)
다음 명령을 사용하여 위의 파일을 컴파일 할 수 있습니다.
$ javac HelloWorld.java
이렇게하면 "HelloWorld.class"라는 파일이 생성되며 다음과 같이 실행할 수 있습니다.
$ java HelloWorld
Hello world!
이 예제에서 주목해야 할 핵심 사항은 다음과 같습니다.
- 소스 파일 이름 "HelloWorld.java은"소스 파일 ...에서 클래스 이름과 일치해야합니다
HelloWorld
. 일치하지 않으면 컴파일 오류가 발생합니다. - 바이트 코드 파일명 "HelloWorld.class"는 클래스 명에 대응한다. "HelloWorld.class"의 이름을 바꾸려면 실행하려고 할 때 오류가 발생합니다.
-
java
사용하여 Java 응용 프로그램을 실행하는 경우 바이트 코드 파일 이름이 아닌 클래스 이름을 제공합니다.
패키지를 사용한 예
가장 실용적인 Java 코드는 패키지를 사용하여 클래스의 네임 스페이스를 구성하고 우발적 인 클래스 이름 충돌 위험을 줄입니다.
com.example
패키지 호출에서 HelloWorld
클래스를 선언하고 싶다면, "HelloWorld.java"는 다음 자바 소스를 포함 할 것이다 :
package com.example;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
이 소스 코드 파일은 패키지 이름 지정에 해당하는 구조의 디렉토리 트리에 저장해야합니다.
. # the current directory (for this example)
|
----com
|
----example
|
----HelloWorld.java
다음 명령을 사용하여 위의 파일을 컴파일 할 수 있습니다.
$ javac com/example/HelloWorld.java
그러면 "com / example / HelloWorld.class"라는 파일이 생성됩니다. 즉, 컴파일 후 파일 구조는 다음과 같아야합니다.
. # the current directory (for this example)
|
----com
|
----example
|
----HelloWorld.java
----HelloWorld.class
그러면 다음과 같이 애플리케이션을 실행할 수 있습니다.
$ java com.example.HelloWorld
Hello world!
이 예제에서주의해야 할 추가 사항은 다음과 같습니다.
- 디렉토리 구조는 패키지 이름 구조와 일치해야합니다.
- 클래스를 실행할 때 전체 클래스 이름을 제공해야합니다. 즉 "com.example.HelloWorld"는 "HelloWorld"가 아닙니다.
- 현재 디렉토리에서 Java 코드를 컴파일하고 실행할 필요가 없습니다. 우리는 일러스트레이션을 위해 여기에서 그것을 수행하고 있습니다.
'javac'를 사용하여 여러 파일을 한 번에 컴파일.
응용 프로그램이 여러 소스 코드 파일로 구성되어 있고 대부분의 경우! 한 번에 하나씩 컴파일 할 수 있습니다. 또는 다음과 같이 경로 이름을 나열하여 동시에 여러 파일을 컴파일 할 수 있습니다.
$ javac Foo.java Bar.java
또는 명령 쉘의 파일 이름 와일드 카드 기능을 사용하여 ....
$ javac *.java
$ javac com/example/*.java
$ javac */**/*.java #Only works on Zsh or with globstar enabled on your shell
이렇게하면 현재 디렉토리의 "com / example"디렉토리에있는 모든 Java 소스 파일과 하위 디렉토리에있는 재귀 적으로 모든 Java 소스 파일이 컴파일됩니다. 세 번째 대안은 소스 파일 이름 (및 컴파일러 옵션) 목록을 파일로 제공하는 것입니다. 예 :
$ javac @sourcefiles
여기서 sourcefiles
파일에는 다음이 포함됩니다.
Foo.java
Bar.java
com/example/HelloWorld.java
참고 : 이처럼 코드를 컴파일하면 작은 1 인칭 프로젝트 및 일회용 프로그램에 적합합니다. 그 외에도 Java 빌드 도구를 선택하여 사용하는 것이 좋습니다. 또는 대부분의 프로그래머는 임베디드 컴파일러와 "프로젝트"의 증분 빌드를 제공하는 Java IDE (예 : NetBeans , Eclipse , IntelliJ IDEA )를 사용합니다.
일반적으로 사용되는 'javac'옵션
다음은 javac
명령에 사용할 수있는 몇 가지 옵션입니다.
-
-d
옵션은 ".class"파일을 작성하기위한 대상 디렉토리를 설정합니다. -
-sourcepath
옵션은 소스 코드 검색 경로를 설정합니다. -
-cp
또는-classpath
옵션은 외부 클래스 및 이전에 컴파일 된 클래스를 찾기위한 검색 경로를 설정합니다. 클래스 패스 및 클래스 패스 지정 방법에 대한 자세한 내용은 클래스 패스 주제를 참조하십시오. -
-version
옵션은 컴파일러의 버전 정보를 인쇄합니다.
컴파일러 옵션의 전체 목록은 별도의 예제에서 설명합니다.
참고 문헌
에 대한 명확한 기준 javac
명령입니다 오라클 매뉴얼 페이지 javac
.
다른 Java 버전 용으로 컴파일
Java 프로그래밍 언어 (및 런타임)는 처음 공개 된 이래 릴리스 이후로 많은 변화를 겪어 왔습니다. 이러한 변경 사항은 다음과 같습니다.
- Java 프로그래밍 언어의 구문과 의미의 변경
- Java 표준 클래스 라이브러리가 제공하는 API의 변경 사항.
- Java (바이트 코드) 명령 세트 및 클래스 파일 형식의 변경.
아주 소수의 예외 (예 : enum
키워드, 일부 "내부"클래스 변경 등)의 경우 이러한 변경 사항은 이전 버전과 호환됩니다.
- 이전 버전의 Java 도구 체인을 사용하여 컴파일 된 Java 프로그램은 다시 컴파일하지 않고 최신 버전 Java 플랫폼에서 실행됩니다.
- 이전 버전의 Java로 작성된 Java 프로그램은 새로운 Java 컴파일러로 성공적으로 컴파일됩니다.
최신 컴파일러로 오래된 Java 컴파일하기
최신 Java 플랫폼에서 더 오래된 Java 코드를 (재) 컴파일하여 최신 플랫폼에서 실행해야하는 경우 일반적으로 특별한 컴파일 플래그를 제공 할 필요가 없습니다. 몇 가지 경우 (예 : 식별자로 enum
을 사용한 경우)에는 -source
옵션을 사용하여 새 구문을 비활성화 할 수 있습니다. 예를 들어 다음 클래스가 제공됩니다.
public class OldSyntax {
private static int enum; // invalid in Java 5 or later
}
Java 5 컴파일러 (또는 그 이상)를 사용하여 클래스를 컴파일하려면 다음이 필요합니다.
$ javac -source 1.4 OldSyntax.java
이전 실행 플랫폼 용으로 컴파일
이전 Java 플랫폼에서 실행되도록 Java를 컴파일해야하는 경우 가장 간단한 방법은 지원해야하는 가장 오래된 버전의 JDK를 설치하고 빌드에서 해당 JDK 컴파일러를 사용하는 것입니다.
최신 Java 컴파일러로 컴파일 할 수도 있지만 복잡합니다. 우선 만족해야만하는 중요한 전제 조건이 있습니다.
- 컴파일중인 코드는 대상 Java 버전에서 사용할 수 없었던 Java 언어 구문을 사용해서는 안됩니다.
- 코드는 이전 플랫폼에서 사용할 수 없었던 표준 Java 클래스, 필드, 메소드 등에 의존해서는 안됩니다.
- 코드에 의존하는 타사 라이브러리도 이전 플랫폼 용으로 빌드해야하며 컴파일 타임 및 런타임에 사용할 수 있어야합니다.
전제 조건이 충족되면 -target
옵션을 사용하여 이전 플랫폼 용 코드를 다시 컴파일 할 수 있습니다. 예를 들어,
$ javac -target 1.4 SomeClass.java
Java 1.4 이상의 JVM과 호환되는 바이트 코드를 생성하도록 위의 클래스를 컴파일합니다. (사실, -source
옵션은 호환 가능한 -target
의미하므로 javac -source 1.4 ...
와 같은 효과가 있습니다. -source
와 -target
사이의 관계는 Oracle 설명서에 설명되어 있습니다.)
간단히 말해서 -target
또는 -source
를 사용하면 컴파일러의 JDK가 제공하는 표준 클래스 라이브러리에 대해 여전히 컴파일됩니다. 조심하지 않으면 정확한 바이트 코드 버전으로 클래스를 작성할 수 있지만 사용할 수없는 API는 종속됩니다. 해결 방법은 -bootclasspath
옵션을 사용하는 것입니다. 예 :
$ javac -target 1.4 --bootclasspath path/to/java1.4/rt.jar SomeClass.java
런타임 라이브러리의 대체 세트에 대해 컴파일합니다. 컴파일되는 클래스가 새로운 라이브러리에 대한 (우발적 인) 의존성을 가지면 컴파일 오류가 발생합니다.