Gradle, "sourceCompatibility"대 "targetCompatibility"?


130

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

Gradle 설명서 에 따르면 :

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

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

답변:



62

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

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

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

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


4
이것은 미묘하지만 매우 중요한 관찰입니다.
Natix

그것들을 어떻게 비교합니까?
zero01alpha

왜 빌드에 실패합니까? "bootstrap classpath"옵션은이 문제를 완화하기 위해 제공됩니다. 항상 올바른 부트 스트랩을 사용할 수 있으며 제대로 작동합니다.
Codebender

6
if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current())이것이 build.gradle 파일의 시작 부분 에서이 문제를 해결하는 방법입니다.
Xerus

2
Java 9부터는 지정된 Java 버전에서 사용 가능한 API 만 허용하여이 문제를 해결하기위한 새로운 javac옵션 --release이 있습니다. 이에 대한 자세한 내용은 stackoverflow.com/a/43103038/4653517
James Mudd

35

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

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

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

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


프로젝트에서 어떤 프로젝트를 사용하고 있는지 어떻게 알 수 있습니까?
isJulian00 2016 년

0

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


0

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 에 따르면

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