使用jackson-dataformat-csv 2.15.0出现NoSuchMethodError问题求助
Jackson CSV导出出现NoSuchMethodError问题排查
问题描述
我使用jackson-dataformat-csv 2.15.0版本编写了如下导出文本文件的代码:
List<HashMap<String, String>> data = <list of data>; PrintWriter out = new PrintWriter(new File(FILE_PATH)); CsvSchema schema = null; CsvSchema.Builder schemaBuilder = CsvSchema.builder(); // output verify list record if (data != null && !data.isEmpty()) { schema = schemaBuilder.addColumn("ID").addColumn("Date").build() .withLineSeparator("\r").withHeader(); CsvMapper mapper = new CsvMapper(); mapper.writer(schema).writeValues(out).writeAll(data); } out.close();
运行时抛出以下错误:
2023-05-14 14:11:25,865 ERROR [stderr] (Thread-394) Exception in thread "Thread-394" java.lang.NoSuchMethodError: com.fasterxml.jackson.dataformat.csv.CsvFactory._createContentReference(Ljava/lang/Object;)Lcom/fasterxml/jackson/core/io/ContentReference; 2023-05-14 14:11:25,865 ERROR [stderr] (Thread-394) at com.fasterxml.jackson.dataformat.csv.CsvFactory.createGenerator(CsvFactory.java:372) 2023-05-14 14:11:25,865 ERROR [stderr] (Thread-394) at com.fasterxml.jackson.dataformat.csv.CsvFactory.createGenerator(CsvFactory.java:16) 2023-05-14 14:11:25,865 ERROR [stderr] (Thread-394) at com.fasterxml.jackson.databind.ObjectWriter.createGenerator(ObjectWriter.java:703) 2023-05-14 14:11:25,865 ERROR [stderr] (Thread-394) at com.fasterxml.jackson.databind.ObjectWriter.writeValues(ObjectWriter.java:789)
已完成的排查动作:
- 检查Maven依赖层级,排除了冲突的Jackson库
- 确认导出的WAR包中jackson-core、jackson-annotations、jackson-databind和jackson-dataformat-csv均为2.15.0版本,无旧版本重复库
- Eclipse未提示方法缺失等编译错误
可能的原因及解决方案
1. 应用服务器自带Jackson版本冲突
即使WAR包内依赖都是2.15.0,Tomcat、JBoss这类应用服务器可能自带旧版本Jackson,运行时优先加载服务器提供的类,导致版本不匹配。
- 解决办法:
- 在
WEB-INF/web.xml中添加配置,强制优先加载WEB-INF/lib下的类:<context-param> <param-name>org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES</param-name> <param-value>false</param-value> </context-param> <loader delegate="false"/> - 或修改服务器配置排除自带Jackson,比如Tomcat在
catalina.properties的tomcat.util.scan.DefaultJarScanner.jarsToSkip中添加Jackson相关jar包名。
- 在
2. 隐藏的依赖传递冲突
直接依赖检查无误,但第三方依赖可能间接引入不同版本的Jackson组件,Maven依赖树可能未完全展示,或打包时出现意外。
- 解决办法:
- 执行
mvn dependency:tree -Dverbose,仔细排查所有Jackson组件的版本,确保全量为2.15.0 - 在pom.xml的
dependencyManagement中显式声明所有Jackson相关依赖的版本,阻断依赖传递带来的版本不一致:<dependencyManagement> <dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.15.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.15.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-csv</artifactId> <version>2.15.0</version> </dependency> </dependencies> </dependencyManagement>
- 执行
3. 编译与运行环境不一致
Eclipse编译用了正确版本,但运行时类路径被其他配置覆盖:
- Eclipse服务器运行配置中混入了旧版本Jackson jar
target目录残留旧编译产物或jar包- 解决办法:
- 执行
mvn clean install彻底清理旧产物后重新打包 - 检查Eclipse服务器运行配置,确保类路径仅包含WEB-INF/lib下的jar
- 手动删除
target目录后重新部署
- 执行
4. 输出流类型兼容性问题
虽然报错指向方法缺失,但PrintWriter可能存在流处理兼容性问题,可尝试替换为FileOutputStream并使用自动关闭流:
try (FileOutputStream fos = new FileOutputStream(FILE_PATH)) { CsvMapper mapper = new CsvMapper(); mapper.writer(schema).writeValues(fos).writeAll(data); } catch (IOException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Kaninchen
相关产品推荐
相关产品推荐

