IntelliJ 单元测试中 Apache poi 和 commons 之间的 NoSuchMethodError Charsets.toCharset()

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

我使用 openjdk temurin-11.0.22 在 Neo4j 4.4.30 的 Neo4j 插件中使用 Apache poi 5.2.3。我们使用 commons-io 2.15.1.

编辑:该问题主要(仅?)发生在直接从代码的上下文菜单中运行 IntelliJ 单元测试时。也许真正的问题是 IntelliJ 没有充分了解代码应该使用哪些依赖项。

我最初使用 import org.apache.poi.xssf.usermodel.XSSFWorkbook 将数据导出到 Excel(因为这是业务用户想要的;你知道它是怎么回事......),但我正在尝试切换到 org.apache .poi.xssf.streaming.SXSSFWorkbook 支持流式传输(因为商业用户需要更多数据)。

当我切换这两个课程时,我得到了

NoSuchMethodError: 'java.nio.charset.Charset org.apache.commons.io.Charsets.toCharset(java.nio.charset.Charset, java.nio.charset.Charset)'

这没有意义,因为 commons-io 2.15.1 确实包含该功能。

我确实注意到 SXSSFWorkbook 对字符集做了一些 XSSFWorkbook 没有做的事情(不知道为什么),但我找不到确切的调用。即便如此,据我所知,commons-io 2.15.1 应该适合 poi 5.2.3。

所以我很困惑为什么这不起作用。我显然不是一个足够的依赖专家来解决这个问题。知道我应该去哪里寻找吗?

编辑:我注意到 ~/.m2/repository 确实包含了 commons-io 的多个版本,包括 2.5、2.6、2.11 和 2.13,但它们来自哪里?

然后我想起了

mvn dependency:tree  -Dverbose -Dincludes=commons-io
,这给出了:

[INFO] com.pwc.beacon:excel-procedures:jar:0.34.0-SNAPSHOT
[INFO] +- com.pwc.beacon:beacon-neo4j-core:jar:0.34.0-SNAPSHOT:provided
[INFO] |  \- (commons-io:commons-io:jar:2.15.1:provided - omitted for duplicate)
[INFO] +- com.pwc.beacon:validation:jar:0.34.0-SNAPSHOT:compile
[INFO] |  \- (commons-io:commons-io:jar:2.15.1:compile - omitted for duplicate)
[INFO] +- org.neo4j:neo4j:jar:4.4.30:provided
[INFO] |  +- org.neo4j:neo4j-kernel:jar:4.4.30:provided
[INFO] |  |  \- (commons-io:commons-io:jar:2.11.0:provided - omitted for conflict with 2.15.1)
[INFO] |  +- org.neo4j:neo4j-record-storage-engine:jar:4.4.30:provided
[INFO] |  |  \- (commons-io:commons-io:jar:2.11.0:provided - omitted for conflict with 2.15.1)
[INFO] |  \- org.neo4j.app:neo4j-server:jar:4.4.30:provided
[INFO] |     \- (commons-io:commons-io:jar:2.11.0:provided - omitted for conflict with 2.15.1)
[INFO] +- org.neo4j.test:neo4j-harness:jar:4.4.30:test
[INFO] |  \- org.neo4j.app:neo4j-server:test-jar:tests:4.4.30:test
[INFO] |     \- (commons-io:commons-io:jar:2.11.0:test - omitted for conflict with 2.15.1)
[INFO] +- org.apache.poi:poi:jar:5.2.3:compile
[INFO] |  \- (commons-io:commons-io:jar:2.11.0:compile - omitted for conflict with 2.15.1)
[INFO] +- org.apache.poi:poi-ooxml:jar:5.2.3:compile
[INFO] |  \- (commons-io:commons-io:jar:2.11.0:compile - omitted for conflict with 2.15.1)
[INFO] +- org.apache.commons:commons-compress:jar:1.26.0:provided (scope not updated to compile)
[INFO] |  \- (commons-io:commons-io:jar:2.15.1:provided - omitted for duplicate)
[INFO] \- commons-io:commons-io:jar:2.15.1:compile

但这意味着什么?没有 2.5 或 2.6,并且所有 2.11 都被省略。

Edit2:进行了更多挖掘,查看 Maven 实际下载的内容,尽管 dependency:tree 否认了这一点,maven 确实下载了 commons-io 的多个版本:

[INFO] --- resources:3.3.1:resources (default-resources) 
Downloading from central: https://artifacts-central.pwc.com:443/artifactory/c00010-pwc-nl-tax-technology-maven/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar

[INFO] --- compiler:3.11.0:compile (default-compile)
Downloading from central: https://artifacts-central.pwc.com:443/artifactory/c00010-pwc-nl-tax-technology-maven/commons-io/commons-io/2.6/commons-io-2.6.jar

[INFO] --- surefire:3.1.2:test (default-test)
Downloaded from central: https://artifacts-central.pwc.com:443/artifactory/c00010-pwc-nl-tax-technology-maven/commons-io/commons-io/2.12.0/commons-io-2.12.0.jar 

所以我想这解释了它们的来源,但是为什么它没有出现在

mvn dependency:tree
中,以及如何防止它们下载错误的版本?

java maven intellij-idea apache-poi
1个回答
0
投票

我仍然不知道为什么 Java 使用错误的 commons-io,但我想出了如何覆盖它。该项目是共享父 pom 下的几个项目之一,所有依赖项都在该父 pom 中处理。显然 Maven 可以理解这一点(至少在最好的情况下;有时会出错),但 JUnit 不能。

IntelliJ 直接使用 JUnit 来运行单独的测试,为此,它显然会查阅子 pom,但不会查阅父 pom。将 commons-io 的覆盖放在子 pom 中可以解决这个问题。

我仍然不明白为什么,如果有人能解释这一点,我将不胜感激,但至少我找到了解决方案。或者至少是一个足够实用的解决方法。

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