使用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
相关产品推荐
相关产品推荐

