자바 (9)의 javac
새로운 플래그 --release
이있다? 그냥 -source X -target X
의 지름길입니까?Java 9 컴파일러에서 --release 플래그 란 무엇입니까?</p> <pre><code>> javac --help ... --release <release> Compile for a specific VM version. Supported targets: 6, 7, 8, 9 </code></pre> <p>어떻게이 <code>-source</code> 및 <code>-target</code> 플래그 다른 :
답변
정확하게는 아닙니다. 여기에 옵션에 대한 proposal에 대한 링크는 다음과 같습니다
우리는 자동으로 주어진 플랫폼 버전의 구현에 연결됩니다 클래스 파일을 생성하는 컴파일러를 구성하는 새 명령 줄 옵션,--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 버전과 이전 버전의 실행을 허용하는 API가 포함됩니다. 매우 자주 잊혀 졌기 때문에 크로스 컴파일 할 때 필요한 모든 작업을 수행하는 명령 줄 옵션 하나를 추가하기로 결정했습니다.
추가 읽기 in the mailing list 및 Oracle Docs. 원래의 버그는 here로 접수되었습니다. 이 옵션의 통합 이후 JDK 빌드는 "위험 및 가정"섹션에서 언급 한 이전 릴리스의 플랫폼 API에 대한 설명과 함께 번들되었습니다. 즉, 크로스 컴파일 작업을 위해 컴퓨터에 설치된 이전 버전이 필요하지 않습니다. -source
및 -target
안전하게 이전 릴리스로 컴파일하기에 충분하지 않기 때문에
--release X
는 -source X -target X
단지 바로 가기 이상입니다. 또한 이전 버전과 일치해야하는 -bootclasspath
플래그를 설정해야합니다 (이 플래그는 종종 잊어 버립니다). 따라서 Java 9에서는 플래그를 하나 만들었습니다.이 플래그는 -source
, -target
및 -bootclasspath
의 세 플래그를 대체합니다.
따라서 Java 1로 컴파일하는 예입니다.7 :
javac --release 7 <source files>
컴퓨터에 JDK 7이 설치되어 있지 않아도됩니다. JDK 9에는 이미 JDK 7에없는 심볼에 우발적 인 링크를하지 못하게하는 데 필요한 정보가 이미 들어 있습니다.