Kotlin Multiplatform: Resolvendo Conflitos de Versão do Java no Build Phase do Xcode
Tags: iOS, SwiftUI, KMP, Kotlin
457 palavras; 2 minutos de leitura
Se você trabalha com Kotlin Multiplatform há algum tempo, é provável que tenha mais de um SDK do Java instalado na sua máquina. Desenvolvimento Android, Spring Framework, ferramentas de linha de comando – cada um tem suas próprias preferências de versão, e gerenciar isso faz parte do trabalho.
Na maior parte do tempo, o seu shell profile resolve isso sem problemas. Mas existe um lugar onde essa configuração falha silenciosamente: o Build Phase do Xcode.
Por que o Xcode não enxerga a sua configuração do Java
Quando o template do KMP configura o target iOS, ele adiciona um script no Build Phase que chama embedAndSignAppleFrameworkForXcode no projeto Gradle compartilhado. O problema é que o Xcode executa esse script em um ambiente bash isolado, que não carrega o seu .zshrc, .bash_profile, nem qualquer outro arquivo onde você configurou o seu toolchain do Java. Em vez de usar a versão que você definiu, o Gradle pega qualquer versão do Java que estiver no topo do path do sistema. Se essa versão for o Java 25 e o seu projeto exigir o Java 21, o build falha.
A solução
Antes da correção, o script padrão do Build Phase tem esta aparência:
if [ "YES" = "$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED" ]; then
echo "Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\""
exit 0
fi
cd "$SRCROOT/.."
./gradlew :shared:embedAndSignAppleFrameworkForXcode
A solução é definir o JAVA_HOME inline, com escopo restrito àquela invocação do Gradle, usando o utilitário java_home do próprio macOS:
if [ "YES" = "$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED" ]; then
echo "Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\""
exit 0
fi
cd "$SRCROOT/.."
JAVA_HOME="$(/usr/libexec/java_home -v21)" ./gradlew :shared:embedAndSignAppleFrameworkForXcode
O comando /usr/libexec/java_home -v21 resolve o caminho completo para a instalação do Java 21. Definindo inline, a variável afeta apenas aquele comando específico, sem interferir no restante do ambiente de build.
Ajuste o número da versão conforme o que o seu projeto exige. Se não tiver certeza de quais versões estão disponíveis na sua máquina, execute /usr/libexec/java_home -V (V maiúsculo) para listar todas elas.
Vale lembrar
Este é um arquivo de template, o que significa que ele pode ser regenerado caso você execute novamente o setup do projeto KMP. Vale registrar essa alteração em algum lugar no projeto – um comentário no próprio script já resolve – para não ser pego de surpresa depois de uma atualização.
Simples, direto, e espero que útil para quem esbarrar no mesmo problema.