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
입니까?
답변
정확히.
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에 대한 설명이 번들로 제공됩니다. 즉, 크로스 컴파일이 작동하기 위해 컴퓨터에 이전 버전을 설치할 필요가 없습니다.
답변
--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에없는 기호에 실수로 링크하는 것을 방지하는 데 필요한 정보가 이미 포함되어 있습니다.