¿Te has encontrado con "Module was compiled with an incompatible version of Kotlin"? ¡No estás solo!
\n\nImagina: estás escribiendo código en Kotlin, todo funciona como un reloj, pero de repente — ¡pum! — el estudio (o la consola) muestra un largo mensaje rojo con un texto amenazante sobre "incompatible version of Kotlin" y unas versiones 1.5.1 y 1.1.16. ¿Te resulta familiar? Si alguna vez has trabajado con Kotlin en Android Studio, IntelliJ IDEA o simplemente has compilado un proyecto con Gradle, es probable que este error te haya hecho agarrarte la cabeza.
\n\nLa buena noticia: se soluciona rápido y sin cirugía. La mala noticia: si no lo entiendes, volverá una y otra vez. Hoy vamos a desmenuzar este error, entender por qué ocurre y olvidarnos de él para siempre. ¡Allá vamos!
\n\n¿Qué significa realmente este mensaje?
\n\nTraduzcamos del "lenguaje informático" al humano. Kotlin, como cualquier lenguaje moderno, evoluciona constantemente. Cada nueva versión del compilador añade funciones, corrige errores y... cambia el formato de los metadatos internos (archivos binarios que describen tus clases y funciones).
\n\nCuando conectas una biblioteca de terceros (o un módulo de tu proyecto), el compilador verifica: "¿Esta biblioteca fue compilada con la misma versión de Kotlin?" Y si la versión de los metadatos de la biblioteca (por ejemplo, 1.5.1) no coincide con la versión que espera tu compilador actual (por ejemplo, 1.1.16), se queja con razón. Es como intentar insertar una tarjeta SD de una cámara antigua en un portátil nuevo: físicamente no encaja.
\n\nEn nuestro caso, el error dice: "La biblioteca (módulo) se compiló con metadatos de la versión 1.5.1, pero yo (el compilador) espero la versión 1.1.16". Normalmente, esto significa que la versión del plugin de Kotlin en tu proyecto está desactualizada o, por el contrario, la biblioteca es demasiado nueva.
\n\n¿Por qué ocurre esto? 3 razones principales
\n\n1. Disparidad de versiones en Gradle (lo más común)
\n\n¿Alguna vez has actualizado una dependencia olvidando actualizar el propio plugin de Kotlin? ¿O al revés: actualizaste el plugin pero las bibliotecas antiguas se quedaron? Una situación típica en proyectos de Android con muchos módulos.
\n\n// build.gradle (Nivel de proyecto)\nplugins {\n id 'org.jetbrains.kotlin.android' version '1.5.1' apply false // Plugin nuevo\n}\n\n// build.gradle (Nivel de módulo)\ndependencies {\n implementation 'com.some.library:old-lib:1.0.0' // Y esta librería se compiló con Kotlin 1.1.16\n}\n\nEl compilador ve: plugin — 1.5.1, biblioteca — antigua. Y grita: "¡Incompatibilidad!"
\n\n2. Conflicto en proyectos multimódulo
\n\nSi tienes un proyecto con varios módulos (por ejemplo, app, core, feature), y cada uno tiene su propia versión de Kotlin, espera problemas. Un módulo se compiló con Kotlin 1.5.1, otro con 1.1.16. Al intentar vincularlos, aparece ese error.
3. Importación "manual" de archivos JAR/AAR
\n\n¿Descargaste una biblioteca de internet y la pusiste en la carpeta libs? Genial, pero si esa biblioteca se compiló con una versión de Kotlin diferente a la de tu proyecto — hola, error.
¿Cómo se ve esto en el código? Ejemplo para entender
\n\nSimulemos la situación. Tienes un proyecto en Kotlin 1.1.16 (sí, es antiguo, pero sirve para el ejemplo). Conectas una biblioteca que utiliza las funciones más modernas de Kotlin 1.5.1.
\n\n// Tu código (Kotlin 1.1.16)\nfun main() {\n val result = SomeLibrary().doSomething() // ¡Error!\n println(result)\n}\n\nY dentro de la biblioteca (versión 1.5.1) se usa, por ejemplo, inline fun interface o sealed interface, que simplemente no existen en la versión antigua. El compilador no entiende qué es eso y muestra el error de incompatibilidad de metadatos.
Solución paso a paso: de lo simple a lo complejo
\n\nPaso 1. Verifica la versión del plugin de Kotlin
\n\nAbre el build.gradle raíz (o build.gradle.kts) de tu proyecto. Busca la línea con la versión de Kotlin:
//