Skip to content

NoClassDefFoundError when parsing emails with jakarta classes #109

@sixcorners

Description

@sixcorners

If you bring in
implementation("com.google.appengine:appengine-api-1.0-sdk:2.0.25")
and
implementation("com.sun.mail:jakarta.mail:2.0.1")
it will break when you try to parse emails.

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 io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:508)
	at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:468)
	at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:518)
	at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:468)
	at jakarta.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:613)
	at jakarta.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:591)
	at jakarta.activation.CommandMap.createDataContentHandler(CommandMap.java:210)
	at jakarta.activation.DataHandler.getDataContentHandler(DataHandler.java:588)
	at jakarta.activation.DataHandler.getContent(DataHandler.java:515)
	at jakarta.mail.internet.MimeMessage.getContent(MimeMessage.java:1484)
...
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)
	at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:518)
	at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:468)
	... 21 more

I'm not sure how this should be fixed. I think the mailcap file is registering some handlers that jakarta mail is trying to load. I don't see a way to differentiate between classes that should be loaded by jakarta mail vs javax mail. I really hate the javax name change.

If you add
implementation("javax.activation:activation:1.1.1")
then it says

java.lang.ClassCastException: class org.apache.geronimo.mail.handlers.MultipartHandler cannot be cast to class jakarta.activation.DataContentHandler (org.apache.geronimo.mail.handlers.MultipartHandler and jakarta.activation.DataContentHandler are in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @663c9e7a)
	at jakarta.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:620)
	at jakarta.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:591)
	at jakarta.activation.CommandMap.createDataContentHandler(CommandMap.java:210)
	at jakarta.activation.DataHandler.getDataContentHandler(DataHandler.java:588)
	at jakarta.activation.DataHandler.getContent(DataHandler.java:515)
	at jakarta.mail.internet.MimeMessage.getContent(MimeMessage.java:1484)
...

Metadata

Metadata

Assignees

Labels

duplicateThis issue or pull request already exists

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions