2017-12-14 1 views
0

나는 현재 Gradle을 사용하고 내가sourcecompatiblity의 targetcompatibility 사용 이유

나는 우리가 이전 버전과 호환 될 이외의 sourcecompatibility/targetcompatibility를 사용하는 이유를 무엇 궁금 자바 플러그인을 통해 sourcecompatibility 및 targetcompatibility을 설정할 수 있습니다처럼 보인다 이전 JDK?

sourcecompatibility/targetcompatibility가 설정되지 않은 경우 최신 Java로 업그레이드하는 것이 쉬울까요?

sourcecompatibility와 targetcompatibility를 모두 사용해야합니까?

답변

1

sourceCompatibilitytargetCompatability 변수와 직접적 javac-source-target 스위치와 관련이있다. 이들은 크로스 컴파일에 사용됩니다 (relevant documentation for javac, relevant SO question). 이러한 값의 유일한 목적은 클래스 파일을 이전 버전과 호환되도록 만드는 것입니다. 그들은 실제로 다른 목적을 수행하지 않습니다. 이 기능은 보안을 위해 추가 된 기능입니다. 컴퓨터에 안전하지 않은 오래된 JDK를 설치하는 대신 최신 버전을 설치하고이 값을 사용하여 코드를 컴파일 할 수 있습니다.

이 플래그에는 하나의 주요한 경고가 있습니다.이 값을 설정한다고해서 작성한 코드가 이전 JVM에서 작동한다는 것을 의미하지는 않습니다. javac은 클래스를 컴파일하여 이전 JVM과 호환되도록하지만 이전 JVM에없는 메소드에 바인딩을 끝낼 수 있기 때문입니다. 당신이 '1.6'에 호환성 값을 설정하고 당신은 JDK (8)을 사용하여, 당신은 여전히 ​​다음과 같은 코드를 작성할 수 있습니다 빌드를 실행하는 경우

예를 들어, :

Objects.equals(obj1, obj2); 

을 그리고 컴파일러는 불평하지 않을 것이다. 그것은 그 라인에 대해 불평하지 않고 계속 될 것입니다. 자바 6을 실행하려고하는 경우에는, 당신은 Objects이 자바 7

에 도입 다르게 넣어 때문에 Objects.equals이 존재하지 않는다는 오류가 발생하는 것 : 할 -source-target당신의 .class 호환 파일 예를 들어, 구형 JVM의 경우 은 코드로을 사용한 클래스와 메소드의 유효성을 검사하지 않습니다. 이를 수행 할 수있는 유일한 방법은 -bootclasspath입니다.이 시점에서 이전의 JDK를 다운로드하여 컴파일해야하므로 rt.jar 파일이 필요합니다 (relevant SO question).

업그레이드와 관련하여 이러한 값을 설정해도 업그레이드 가능성이 반드시 제한되는 것은 아닙니다. 작성한 코드는 해당 버전에서 사용할 계획이라면 사용하는 모든 값과 호환되어야하지만 새로운 기능 및 API를 사용하기 시작하면 변경하지 않습니다.