Si llegaste acá buscando exactamente este error, probablemente tienes esto en tu log:
java.lang.ClassNotFoundException: javax.activation.DataSource
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(...)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(...)
Aparece al desplegar una aplicación con JAX-WS, JavaMail, o cualquier librería que dependa de JAF (JavaBeans Activation Framework), corriendo sobre Tomcat 11 con Java 17.
Por qué pasa
Java 11 removió del JDK los módulos que antes venían incluidos por defecto: javax.activation, javax.xml.bind, javax.xml.ws, entre otros (eran parte de Java EE, movidos fuera del JDK base desde Java 9 y eliminados del todo en Java 11). Si tu código o una librería de terceros todavía referencia el paquete javax.activation.*, ya no existe en el classpath por defecto — tienes que traerlo tú explícitamente.
Para hacerlo más confuso: Jakarta EE renombró el namespace de javax.* a jakarta.* a partir de Jakarta EE 9. Tomcat 11 corre sobre la especificación Jakarta más nueva, así que si tu librería todavía usa el paquete viejo javax.activation, hay un choque de namespace además de la ausencia del módulo.
La solución
Agregar la dependencia de Jakarta Activation (no la vieja javax.activation, sino su sucesora):
Maven (pom.xml):
<dependency>
<groupId>jakarta.activation</groupId>
<artifactId>jakarta.activation-api</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>jakarta.activation</artifactId>
<version>2.0.1</version>
</dependency>
Gradle (build.gradle):
implementation 'jakarta.activation:jakarta.activation-api:2.1.3'
implementation 'com.sun.activation:jakarta.activation:2.0.1'
Si tu proyecto no usa gestor de dependencias y despliegas JARs manualmente en Tomcat, descarga el JAR directamente y colócalo en:
cp jakarta.activation-2.0.1.jar $CATALINA_HOME/lib/
Reinicia Tomcat después de cualquiera de las dos opciones.
Si el error persiste después de agregar la dependencia
Verifica que no tengas dos versiones conflictivas en el classpath — el error clásico de tener tanto javax.activation viejo como jakarta.activation nuevo cargados a la vez, donde uno pisa al otro según el orden de carga del classloader:
find ~/.m2 -iname "*activation*.jar" 2>/dev/null
# o si usas Gradle:
find ~/.gradle -iname "*activation*.jar" 2>/dev/null
Si aparece más de un JAR de activation con distinto namespace, excluye el viejo explícitamente en tu POM:
<exclusions>
<exclusion>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
</exclusion>
</exclusions>
Resumen para copiar y pegar
- El error aparece porque Java 11+ removió del JDK los módulos Java EE, incluyendo activation.
- Agrega
jakarta.activation-api+jakarta.activation(no la versiónjavax.*vieja) como dependencia explícita. - Si usas JARs manuales, cópialo directo a
$CATALINA_HOME/lib/y reinicia Tomcat. - Si persiste, busca JARs duplicados de activation con distinto namespace compitiendo en el classpath.
Top comments (0)