[TIL] Gradle: Java(Kotlin) targetCompatibility, jvmTarget
포스트
취소

[TIL] Gradle: Java(Kotlin) targetCompatibility, jvmTarget

Java 또는 Kotlin으로 구성된 Gradle 프로젝트에서 아래와 같은 빌드 스크립트를 본 적이 있을 것이다. 이 중 targetCompatibility에 대해서 알아볼 것이다. 이 프로젝트의 jar 파일을 실행하는 JVM runtime version 또는 다른 jar artifact를 의존할 때 이 targetCompatibility가 중요하다.

이 설정은 Kotlin/JVM을 개발할 때도 중요하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
// build.gradle.kts
tasks {
    withType<JavaCompile> {
        sourceCompatibility = "11"
        targetCompatibility = "11"
    }

    withType<KotlinCompile> {
        kotlinOptions {
            jvmTarget = "11"
        }
    }
}

server, lib 두 개의 Gradle 프로젝트 모듈 또는 jar artifact가 있다고 하자.

server가 lib 모듈에 의존할 때

  • server의 targetCompatibility가 1.8일 때
  • lib의 targetCompatibility가 11이면 server는 컴파일 불가능하다.

아래와 같은 에러를 만나게 된다.

1
2
3
4
5
6
7
8
9
10
Execution failed for task ':compileKotlin'.
> Could not resolve all files for configuration ':compileClasspath'.
   > Could not resolve {MODULE}.
     Required by:
         project :
      > No matching variant of {MODULE} was found. The consumer was configured to find an API of a library compatible with Java 8, preferably in the form of class files, and its dependencies declared externally, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'jvm' but:
          - Variant 'apiElements' capability {MODULE} declares an API of a library, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'jvm':
              - Incompatible because this component declares a component compatible with Java 11 and the consumer needed a component compatible with Java 8
          - Variant 'runtimeElements' capability {MODULE} declares a runtime of a library, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'jvm':
              - Incompatible because this component declares a component compatible with Java 11 and the consumer needed a component compatible with Java 8

KotlinCompile type task들의 kotlinOptions.jvmTarget에 대해서도 비슷한 이슈가 있다.

Kotlin의 jvmTarget을 "11"로 설정하면 Java 8 runtime에서 실행할 수 없다. Apache Flink 구 버전이 Java 8에서 실행되고 있어서 위 에러를 만났었다.

https://flink.apache.org/

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

[TIL] Spring MVC: Filter vs HandlerInterceptor

[TIL] Logback 용어들: Appender, Encoder, Layout