DEV Community

Carlos Arturo Castaño G.
Carlos Arturo Castaño G.

Posted on

Solución: ClassNotFoundException javax.activation.DataSource en Tomcat 11 + Java 17

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(...)
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

Gradle (build.gradle):

implementation 'jakarta.activation:jakarta.activation-api:2.1.3'
implementation 'com.sun.activation:jakarta.activation:2.0.1'
Enter fullscreen mode Exit fullscreen mode

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/
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

Resumen para copiar y pegar

  1. El error aparece porque Java 11+ removió del JDK los módulos Java EE, incluyendo activation.
  2. Agrega jakarta.activation-api + jakarta.activation (no la versión javax.* vieja) como dependencia explícita.
  3. Si usas JARs manuales, cópialo directo a $CATALINA_HOME/lib/ y reinicia Tomcat.
  4. Si persiste, busca JARs duplicados de activation con distinto namespace compitiendo en el classpath.

Top comments (0)