Gradle, “sourceCompatibility”대 “targetCompatibility”? : sourceCompatibility”Java 소스를

sourceCompatibility과 의 관계 / 차이는 무엇입니까 targetCompatibility? 다른 값으로 설정하면 어떻게됩니까?

Gradle 설명서 에 따르면 :

sourceCompatibility“Java 소스를 컴파일 할 때 사용할 Java 버전 호환성”입니다.
targetCompatibility“클래스를 생성하는 Java 버전”입니다.

내 이해는 targetCompatibility특정 버전의 Java와 호환되는 Java 바이트 코드를 생성 한다는 것입니다.이 기능의 하위 집합 sourceCompatibility입니까?



답변

targetCompatibilitysourceCompatibility매핑 -target release-source releasejavac의에. 소스는 기본적으로 소스 언어 레벨이며 대상은 생성 된 바이트 코드의 레벨입니다.

자세한 내용은 javac the cross compilation 섹션 에서 찾을 수 있습니다 .


답변

사용할 때주의하십시오. 우리는 사람들이 가정을하고 물린 적이 있습니다.

1.5의 sourceCompability (또는 targetCompatibility)를 사용한다고해서 항상 JDK 1.6으로 코드를 컴파일하고 JDK 1.5에서 작동 할 것으로 기대할 수있는 것은 아닙니다. 문제는 사용 가능한 라이브러리입니다.

코드에서 JDK 1.6에서만 사용할 수있는 일부 메서드를 호출하는 경우 대상 VM에 대한 다양한 호환성 옵션으로 컴파일됩니다. 그러나 실행하면 문제가되는 메소드가 없기 때문에 실패합니다 (MethodNotFoundException 또는 ClassNotFoundException이 발생 함).

이러한 이유로 항상 호환성 설정을 빌드중인 실제 Java 버전과 비교합니다. 일치하지 않으면 빌드가 실패합니다.


답변

sourceCompatibility = Java 프로그래밍 언어 버전을 사용하여 .java 파일 을 컴파일하도록 지정 합니다. 예를 들어 sourceCompatibility 1.6 = .java 파일 을 컴파일하는 데 Java 프로그래밍 언어 버전 1.6을 사용하도록 지정 합니다.

기본적으로 sourceCompatibility = “사용중인 현재 JVM의 버전”및 targetCompatibility = sourceCompatibility

targetCompatibility =이 옵션은 생성 된 클래스 파일이 targetCompatibility에 의해 지정된 VM과 호환되도록합니다. 대부분의 경우 -target 옵션의 값은 -source 옵션의 값입니다. 이 경우 -target 옵션을 생략 할 수 있습니다.

클래스 파일은 targetCompatibility 및 이후 버전에서 지정한 대상에서 실행되지만 이전 버전의 VM에서는 실행되지 않습니다.


답변

내 의견으로는 “sourceCompatibility”는 소스 코드에서 사용할 수있는 기능을 의미합니다. 예를 들어 sourceCompatibility를 1.7로 설정하면 jdk 버전이더라도 Java 8의 새로운 기능 인 람다 식을 사용할 수 없습니다 1.8.
“targetCompatibility”는 생성 된 클래스 파일을 실행할 수있는 jre 버전을 의미하며 1.8로 설정하면 jdk 1.7에서 성공적으로 실행되지 않을 수 있지만 일반적으로 상위 버전의 jdk에서 실행될 수 있습니다.


답변

javac 명령의 플래그입니다.

javac [options] [sourcefiles]

Options:
...
-source release - Specifies the version of source code accepted.
...
-target release - Generates class files for a specific VM version.
...

즉, source버전 으로 코드를 작성하고 클래스를target VM 버전으로 . 예를 들어 이전 Java 버전의 다른 워크 스테이션에서 실행하기 위해.

https://docs.oracle.com/en/java/javase/11/tools/javac.html 에 따르면


답변