Flutter Build Gradle, JDK, Kotlin 대삽질 여행

noni·2024년 11월 15일
1

개발 환경: OSX, Android Studio, Flutter, JDK17, Gradle 7.5

사이드 프로젝트로 Flutter 개발을 진행 중에 마주한 에러...
python이 주언어인 나에게 venv 개념을 적용할 수 없는 새로운 영역의 개발 프로젝트였다

아니나 다를까 개발 과정에서 가장 고통스러웠던 부분이 의존성 관리 🤯
jdk, kotlin, gradle 간의 호환성을 체크하고 패키지와 프로젝트 버전 사이에 의존성을 관리하는 게 너무 어지러웠다 😇

flutter 가 친절하게 문제 해결 방향을 안내해 주기는 했지만,
고쳐도 계속 나타나는 using incompatible Gradle version 에러 😔

 [!] Your project's Gradle version is incompatible with the Java version that Flutter is using    │
│ for Gradle. 
...
Then, update the Gradle version specified in                                                     │
│ /Users/-/Downloads/proj/capstone-demo/client/android/gradle/wrapper/gradle-wrapper.proper │
│ ties to be compatible with that Java version. See the link below for more information on         │
│ compatible Java/Gradle versions:                                                                 │
│ https://docs.gradle.org/current/userguide/compatibility.html#java    

삽질의 기록

먼저 에러 로그가 안내해 준 대로 현재 내 로컬 JDK에 맞는 Gradle, kotlin 버전을 찾아 수정해 준다
https://docs.gradle.org/current/userguide/compatibility.html#java

# 1) ~/android/gradle/gradle-wrapper.properties 파일 수정
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-8.3-all.zip

# 2) ~/android/app/src/build.gradle 파일 수정
plugins {
   id "com.android.application"
   id "kotlin-android"
   id "dev.flutter.flutter-gradle-plugin"
   id "com.google.gms.google-services"  // Google Services plugin
}
...
android {
    compileSdkVersion 34
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }
    lintOptions {
        disable 'InvalidPackage'
        checkReleaseBuilds false
    }
    defaultConfig {
        applicationId "com.mycompany.test"
        minSdkVersion 23
        targetSdkVersion 34
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }
        minSdkVersion 23
        targetSdkVersion 34
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }
    ...
    }
}
}
    ...
    }
}
...
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.10"
}

그래도 동일 > 다른 버전 > 반복 > 다른 버전 > ...
그런데 뭔가 이상하다

로컬 java home 은 17 인데 android studio flutter 는 자꾸만 21로 잡는다?
아래 명령어를 다 사용해 봐도 요지부동!

$ ./gradlew clean
$ ./gradlew --refresh-dependencies
$ ./gradlew lintDebug -PwriteBaselineFile=true

그러다 문득 $ flutter create . 명령어를 실행하라는 코멘트를 발견한다
결과는?

All done!
You can find general documentation for Flutter at: https://docs.flutter.dev/
Detailed API documentation is available at: https://api.flutter.dev/
If you prefer video documentation, consider: https://www.youtube.com/c/flutterdev

In order to run your application, type:

  $ cd .
  $ flutter run

Your application code is in ./lib/main.dart.

The configured version of Java detected may conflict with the Gradle version in your new Flutter app.

[RECOMMENDED] If so, to keep the default Gradle version 8.3, make
sure to download a compatible Java version
(Java 17 <= compatible Java version < Java 21).
You may configure this compatible Java version by running:
`flutter config --jdk-dir=<JDK_DIRECTORY>`
Note that this is a global configuration for Flutter.


Alternatively, to continue using your configured Java version, update the Gradle
version specified in the following file to a compatible Gradle version (compatible Gradle version range: 8.4 - 8.7):
/Users/-/Downloads/proj/grammar-backend/client/android/gradle/wrapper/gradle-wrapper.properties

You may also update the Gradle version used by running
`./gradlew wrapper --gradle-version=<COMPATIBLE_GRADLE_VERSION>`.

See
https://docs.gradle.org/current/userguide/compatibility.html#java for details
on compatible Java/Gradle versions, and see
https://docs.gradle.org/current/userguide/gradle_wrapper.html#sec:upgrading_wrapper
for more details on using the Gradle Wrapper command to update the Gradle version
used.

OMG 😳 flutter prj를 잡아주고 성공하자 매우매우 친절한 로그가 출력된다
현재 플젝에 jdk config 지정, gradle 버전 재설정 하니 flutter run 성공!

$ flutter config --jdk-dir=<JDK_DIRECTORY>
$ ./gradlew wrapper --gradle-version=<COMPATIBLE_GRADLE_VERSION>

기초 구조를 git 에서 pull 받고 flutter config 지정도 없이 doctor, pub get 을 난무했더니 버전이 꼬일대로 꼬인 것이었다
특히 venv 처럼 응용하겠다고 fvm 커맨드를 난사한 것도 영향이 컸다

제일 좋은 지침서는 공식 문서!

오늘의 교훈이다... 수많은 블로그, stack overflow, llm 의 도움을 받았지만 가장 명쾌한 것은 공식 문서와 디버깅 로그였다

힌트는 역시 가장 가까운 곳에... 🥹

flutter 에도 nvm 과 유사하게 sdk 버전 관리를 지원하는 fvm 이 있다
설치된 여러 jdk 중 프로젝트에 따라 호환되는 버전을 스위칭하는 컨셉 같다
$ fvm use 3.10.5 같이 손쉽게 사용 가능한 기본 개념이니 익숙해지면 좋을 듯하다

profile
#python #mlops

1개의 댓글

comment-user-thumbnail
2025년 5월 9일

감사합니다. 선생님 저도 이것때문에 미쳐버리는줄 알았는데 따라하니까 해결되네요.

답글 달기