我将apache-poi包装在一个带有这些依赖关系的OSGI包中:
我尝试读取这样的.xlsm文件:
FileInputStream fis = new FileInputStream(file);
Workbook workbook = WorkbookFactory.create(fis);
但我得到了这个例外:
$ Exception in thread "JavaFX Application Thread" java.lang.ExceptionInInitializerError
at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:162)
at org.apache.poi.openxml4j.opc.OPCPackage.<init>(OPCPackage.java:142)
at org.apache.poi.openxml4j.opc.Package.<init>(Package.java:37)
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:88)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:273)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:209)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:168)
我不知道我是否错过了依赖关系,或者我的代码是否错误。尝试了很多事情。
答案 0 :(得分:1)
ExceptionInInitializerError
通常表示其中一个加载的类中的某些静态代码块抛出了一个RuntimeException,它没有被捕获到任何地方,从而导致Java停止执行该Thread。
在OPCPackage.java:162
的情况下,类ZipPackagePropertiesMarshaller
可能是第一次使用并因此被加载,这个加载PackagePropertiesMarshaller
,它有一个处理XML初始化的静态代码块-Parser相关功能。
这表明您使用的JVM的版本/样式削弱了XML-Parsing支持或配置不正确。
请尝试使用最新的Oracle Java VM,看看是否会导致问题消失。
另一个可能的原因是,如果您包含一些其他第三方库,这些库会拖入其他一些完全不符合Java-XML接口的XML Parser,从而导致问题。尝试使用简化的测试应用程序来查看是否是这种情况。