Java 9 컴파일러의 --release 플래그는 무엇입니까?


85

Java 9 javac에는 새로운 플래그가 있습니다 --release.

> javac --help
...

--release <release>
    Compile for a specific VM version. Supported targets: 6, 7, 8, 9

-source-target플래그 와 어떻게 다른 가요? 에 대한 바로 가기 -source X -target X입니까?


답변:


106

정확히.

JEP 247 : Compile for Older Platform Versions 는 다음과 같은 새로운 명령 줄 옵션을 정의합니다--release.

--release주어진 플랫폼 버전의 구현에 대해 링크 할 클래스 파일을 생성하도록 컴파일러를 자동으로 구성 하는 새로운 명령 줄 옵션을 정의했습니다 . 에 사전 정의 된 플랫폼의 javac경우 --release N-source N -target N -bootclasspath <bootclasspath-from-N> . (강조 광산)

따라서 아니요, -source N -target N. 이 추가 이유는 "동기"섹션에 설명되어 있습니다.

javac이 제공하는 명령 행 옵션 -source-target컴파일러와는 각각 생산하는 클래스 파일의 버전에서 허용하는 자바 언어의 버전을 선택하는 데 사용될 수있다. 그러나 기본적 javac으로는 최신 버전의 플랫폼 API에 대해 컴파일됩니다. 따라서 컴파일 된 프로그램은 현재 버전의 플랫폼에서만 사용할 수있는 API를 실수로 사용할 수 있습니다. 이러한 프로그램은 -source및에 전달 된 값에 관계없이 이전 버전의 플랫폼에서 실행할 수 없습니다 -target. 옵션. 사용자는 이러한 옵션을 사용하여 지정된 플랫폼 버전에서 실행할 수있는 클래스 파일을 얻을 수 있기를 기대하기 때문에 이는 장기적인 유용성 문제입니다.

간단히 말해 소스 및 대상 옵션을 지정하는 것만으로는 교차 컴파일이 충분하지 않습니다. javac은 기본적으로 최신 플랫폼 API에 대해 컴파일 되기 때문에 이전 버전에서 실행된다는 보장이 없습니다. 또한 -bootclasspath올바르게 크로스 컴파일하려면 이전 버전에 해당 하는 옵션 을 지정해야 합니다. 여기에는 컴파일 할 올바른 API 버전이 포함되며 이전 버전에서 실행할 수 있습니다. 매우 자주 잊혀 졌기 때문에 올바르게 크로스 컴파일하는 데 필요한 모든 작업을 수행하는 하나의 명령 줄 옵션을 추가하기로 결정했습니다.

메일 링리스트Oracle Docs 에서 추가 읽기 . 원래 버그는 여기 에 제출 되었습니다 . 이 옵션의 통합 이후 JDK 빌드에는 "위험 및 가정"섹션에서 언급 한 이전 릴리스의 플랫폼 API에 대한 설명이 번들로 제공됩니다. 즉, 크로스 컴파일이 작동하기 위해 컴퓨터에 이전 버전을 설치할 필요가 없습니다.


한 가지 의심, 코드에서 jdk 9-11의 기능을 사용할 수 있으며 여전히 Java 런타임 8에서 실행됩니까?
Cristiano

아니오, 그들은 jre 8 바이너리에 존재하지 않을 것입니다
Rogue

"플랫폼 API"는 무엇입니까? 바이트 코드 수준에 있습니까? 또는 기본 x86 플랫폼 또는 OS API와 관련된 것이 있습니까?
Jose Cifuentes

2
@JoseCifuentes, 여기에 "플랫폼 API"는 않고, JDK의 API를 자사의 버전을 부여 --releaseJDK는 JDK에서 일반적으로 다릅니다은 사용을 타겟으로 컴파일하는 데에서 플래그를 유추 할 것입니다 -source-target. JDK에서 소개 된 클래스 / 메소드를 사용하지 않고 대상으로하는 클래스 / 메소드를 사용하는 경우에는 이로 인해 당신을 물릴 수 있습니다. 이것은 컴파일러가 이전 버전보다 이후 버전에서 추가 된 메서드 오버로드 를 선택하여 이진 호환성을 조용히 깨뜨릴 경우 매우 미묘 합니다.
Oliver Gondža

30

--release X더 단지 바로 가기보다 -source X -target X때문에 -source하고 -target안전하게 이전 릴리스로 컴파일하기에 충분하지 않다. 또한 -bootclasspath이전 릴리스와 일치해야하는 플래그 를 설정 해야합니다 (이 플래그는 종종 잊혀집니다). 그래서, 자바 9 그들은 하나 만든 --release세 가지 플래그를 대체 플래그 : -source, -target-bootclasspath.

따라서 다음은 Java 1.7로 컴파일하는 예입니다.

javac --release 7 <source files>

컴퓨터에 JDK 7을 설치할 필요조차 없습니다. JDK 9에는 JDK 7에없는 기호에 실수로 링크하는 것을 방지하는 데 필요한 정보가 이미 포함되어 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.