You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jakarta.mail解析.eml文件出现NoSuchMethodError错误求助

问题描述

我编写了将.eml文件解析为JSON文件的代码,使用的依赖如下:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail</artifactId>
    <version>2.0.1</version>
</dependency>

核心代码:

/**
 * Convert .eml file to .json file
 *
 * @param inputFile     .eml file
 * @param outputFile    .json file
 * @return  output file
 * @throws Exception Exception
*/
public File executeTransform(File inputFile, File outputFile) throws Exception {
        try {
            Properties properties = new Properties();
            Session session = Session.getDefaultInstance(properties);

            // Read the .eml file
            InputStream emlInputStream = new FileInputStream(inputFile);
            MimeMessage emlMessage = new MimeMessage(session, emlInputStream);

            // Convert the email message to JSON. convertEmlToJson() This function reads eml, extracts required data from it, puts that data in ObjectNode, and returns that ObjectNode.
            ObjectNode jsonNode = convertEmlToJson(emlMessage);

            // Write JSON to a file
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
            objectMapper.writeValue(outputFile, jsonNode);
        } catch (Exception e) {
            System.err.println("Test log : error occurred " + e.getMessage());
            throw e;
        }
        return outputFile;
    }

执行代码时,在MimeMessage emlMessage = new MimeMessage(session, emlInputStream);这一行抛出java.lang.reflect.InvocationTargetException异常,根因为java.lang.NoSuchMethodError: 'void com.sun.mail.util.LineInputStream.<init>(java.io.InputStream, boolean)',请问该如何解决此问题?

解决方法

这个错误是典型的依赖版本冲突导致的,具体解决步骤如下:

1. 排查冲突依赖

NoSuchMethodError说明运行时加载的LineInputStream类缺少指定构造方法,大概率是项目中同时混入了不同版本的邮件依赖:

  • Jakarta Mail 2.x(com.sun.mail:jakarta.mail)基于Jakarta EE 9规范,包路径从javax.mail改为jakarta.mail;
  • 如果项目中还存在旧版javax.mail:mail或低版本com.sun.mail:jakarta.mail,就会出现类版本不匹配的问题。

用构建工具命令查看依赖树:

  • Maven:执行mvn dependency:tree,查找是否有javax.mail:mail或其他版本的com.sun.mail:jakarta.mail;
  • Gradle:执行./gradlew dependencies,检查冲突依赖项。

2. 排除冲突依赖

找到冲突依赖后,在jakarta.mail依赖中添加排除规则,比如排除旧版javax.mail:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail</artifactId>
    <version>2.0.1</version>
    <exclusions>
        <exclusion>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3. 升级依赖版本(可选)

如果2.0.1版本仍有兼容性问题,可以尝试升级到Jakarta Mail的稳定版本,比如2.1.0:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail</artifactId>
    <version>2.1.0</version>
</dependency>

4. 清理构建缓存

执行构建工具的清理命令,确保旧依赖被完全移除:

  • Maven:mvn clean install
  • Gradle:./gradlew clean build

内容的提问来源于stack exchange,提问作者Vinayak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:22:35