【问题标题】:Exception in thread "main" java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY [closed]线程“主”java.lang.NoSuchFieldError 中的异常:EMPTY_BYTE_ARRAY [关闭]
【发布时间】:2022-01-04 12:18:34
【问题描述】:

我正在学习 selenium 并尝试运行以下代码,但它会引发异常 .NoSuchFieldError: EMPTY_BYTE_ARRAY 。请帮助我了解这个简单程序出了什么问题。

package newpackage;

import java.io.FileInputStream;
import java.io.IOException

import org.apache.poi.xssf.usermodel.*;


public class spp {      

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    String excelFilePath = "./src/DataFiles/GMD.xlsx";
    FileInputStream inputStream = new FileInputStream(excelFilePath);
    
    XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
    XSSFSheet sheet = workbook.getSheetAt(0);
    int rows = sheet.getLastRowNum();
    System.out.println(rows);   
    
}
}

控制台:

线程“main”中的异常 java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY

at org.apache.logging.log4j.core.config.ConfigurationSource.<clinit>(ConfigurationSource.java:56)
at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:32)
at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:85)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:254)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:136)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:123)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:117)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:150)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:196)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:599)
at org.apache.poi.ooxml.POIXMLDocumentPart.<clinit>(POIXMLDocumentPart.java:56)
at newpackage.spp2.main(spp2.java:17)

【问题讨论】:

  • 您正试图访问一个不存在的字段。你在哪一行得到这个异常?另外:供将来参考:javascript和java不一样
  • 这通常发生在您的依赖项版本不兼容时。
  • XSSFWorkbook 工作簿 = 新 XSSFWorkbook(inputStream);
  • 不,这不是引发异常的地方。请向我们展示完整堆栈跟踪。
  • 更新了问题。请检查

标签: java


【解决方案1】:

好的,这与您正在加载的 excel 文件或(可能)您的应用程序代码无关。

发生的事情是当

org.apache.logging.log4j.core.config.ConfigurationSource 

正在初始化......在 log4j 2.x 实现代码的深处......它遇到了二进制兼容性问题。 ConfigurationSource 的代码依赖于一个名为

的类
org.apache.logging.log4j.util.Constants

并试图在该类中使用一个名为EMPTY_BYTE_ARRAY 的常量。该字段在编译 ConfigurationSource 类时存在。但它不存在于类加载器发现的 Constants 版本中......恰好与最新版本的 log4j 2.x 源代码匹配。

现在org.apache.logging.log4j.core.config.ConfigurationSource 位于log4j-core 依赖项中,而org.apache.logging.log4j.util.Constants 位于log4j-api 中。

因此,这强烈表明您的应用程序的(运行时)类路径上有不匹配的 log4j-corelog4j-api 类版本。


(我之前认为这是由于修补不当造成的,但我错过了 log4j 代码库中有两个不同的 Constants 类的事实。)

【讨论】:

  • This question 表明这是由于类路径上的 log4j-api 和 log4j-core 版本不兼容。
  • 你是对的。 Constants有两个类org.apache.logging.log4j.core.util.Constantsorg.apache.logging.log4j.util.Constants,而ConfigurationSource依赖于后者。
  • 感谢大家的参与。问题是由于 log4j-api 和 log4j-core .jar 文件的版本不兼容。添加了正确的版本,现在可以使用了。
猜你喜欢
  • 1970-01-01
  • 2013-04-13
  • 2019-08-21
  • 2014-09-08
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多