eclipse-ee4j / eclipse-ee4j/angus-mail

After migrating to angus. How to analyze the java.lang.NoClassDefFoundError: javax/activation/DataContentHandler

Open
#157 7 comments 0 reactions 0 assignees View on GitHub
duplicate question
Dominant language
Java
Stars
87
Forks
23
PR merge metrics
No merged PRs in 30d

Description

I have an application that is currently Java8/OSGi, and I migrated to Java 21/Spring Boot. Basically everything works now, but I still have an issue with mail.

This is my old dependency:

```

com.sun.mail
javax.mail
${javax-mail-version}



javax.activation
activation

```

And this is my new dependency:

```

org.eclipse.angus
angus-mail
2.0.3

```

I ran this locally, and it worked, but when I used Jib to put the application on a Docker image, I get the following:

```
java.lang.NoClassDefFoundError: javax/activation/DataContentHandler
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
at jakarta.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:594)
at jakarta.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:572)
at jakarta.activation.CommandMap.createDataContentHandler(CommandMap.java:205)
at jakarta.activation.DataHandler.getDataContentHandler(DataHandler.java:587)
at jakarta.activation.DataHandler.getContent(DataHandler.java:514)
at jakarta.mail.internet.MimeMessage.getContent(MimeMessage.java:1504)
at org.assimbly.mail.component.mail.MailBinding.extractBodyFromMail(MailBinding.java:302)
at org.assimbly.mail.component.mail.MailMessage.createBody(MailMessage.java:93)
at org.apache.camel.support.MessageSupport.getBody(MessageSupport.java:68)
at org.assimbly.mail.component.mail.MailConsumer.createExchange(MailConsumer.java:406)
at org.assimbly.mail.component.mail.MailConsumer.retrieveMessages(MailConsumer.java:328)
at org.assimbly.mail.component.mail.MailConsumer.poll(MailConsumer.java:164)
at org.apache.camel.support.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:205)
at org.apache.camel.support.ScheduledPollConsumer.run(ScheduledPollConsumer.java:119)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ClassNotFoundException: javax.activation.DataContentHandler
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 38 common frames omitted
```

Thus at the moment it's calling:

`at jakarta.mail.internet.MimeMessage.getContent(MimeMessage.java:1504)`

it throws an error:

`Caused by: java.lang.ClassNotFoundException: javax.activation.DataContentHandler`

As far as I can tell, there are no leftovers that still use javax. However, apparently there is still a reference to javax that causes the classloading error. This is not a bug in Angus (jakarta-mail), but maybe you help me to better analysis it. How to read the stracktrace?, and is there a method to analyze this issue?

as the jakarta.activation-api is a runtime dependency of Angus I already tried to set it explicitly at compile scope, but that didn't make any difference.

Contributor guide

Open the contributing guide

Research direction

Start with the stack trace at jakarta.mail.internet.MimeMessage.getContent and jakarta.activation.MailcapCommandMap, then inspect the Maven dependency tree and the Jib-built image's runtime classpath. Compare the local and container contents for javax.activation and jakarta.activation classes. Done means identifying the dependency or packaging mismatch that causes the container to load javax.activation.DataContentHandler.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, java
Domain
backend, build-system
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.