我有一个使用
javax.mail
和 javax.activation
的模块。现在我搬到了雅加达。我更新了依赖项和所有导入。
当我在本地运行它时,它运行良好,但是当我在 Docker 容器中运行它时,出现以下错误:
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
错误中引用了被调用的 Jakarta 类,但最后它引用了 javax.activation not found。我检查了依赖关系树,没有雅加达以外的引用。我也尝试在 Gradle 中强制使用 Jakarta,但结果相同。
如何找出导致它仍然调用 javax 的原因?
您的问题可能是版本问题。
现在您可以尝试使用以下依赖项:
<dependency>
<groupId>jakarta.activation</groupId>
<artifactId>jakarta.activation-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>jakarta.mail</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.angus.activation</groupId>
<artifactId>jakarta.activation</artifactId>
<version>2.0.0</version>
</dependency>
您可以使用最新版本或根据您的需要。
虽然您的代码在本地运行,但这些依赖项可能没有打包到您的 Docker 容器中。您应该检查 Docker 构建过程以确保包含所需的依赖项。如果您使用多阶段 Docker 构建,请确保最终映像具有所有必要的依赖项,尤其是在复制预构建的
jar
文件时。