appengine-java-standard icon indicating copy to clipboard operation
appengine-java-standard copied to clipboard

NoClassDefFoundError when parsing emails with jakarta classes

Open sixcorners opened this issue 10 months ago • 1 comments

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)
...

sixcorners avatar Apr 11 '24 10:04 sixcorners

For historical compatibility issues, we still rely on ancient geronimo https://github.com/GoogleCloudPlatform/appengine-java-standard/blob/main/external/geronimo_javamail/pom.xml#L47

Might be time to revisit this dep for EE 10, looking at it...

ludoch avatar Apr 29 '24 15:04 ludoch