迁移到雅加达后:java.lang.NoClassDefFoundError:javax/activation/DataContentHandler

问题描述 投票:0回答:1

我有一个使用

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 的原因?

java jakarta-mail jakarta-migration
1个回答
0
投票

您的问题可能是版本问题。

现在您可以尝试使用以下依赖项:

<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
文件时。

© www.soinside.com 2019 - 2024. All rights reserved.