繁体   English   中英

Apache POI、Excel 2007+ XML 和 OSGI

[英]Apache POI, Excel 2007+ XML, and OSGI

对于一个项目,我正在尝试使用 Apache POI 获得 Excel XML 功能以与 OSGI 一起使用。

我已经尝试过 POI ServiceMix 包,但是缺少 ooxml-schemas jar。 将 jar 添加到捆绑包并将其包含在清单中似乎不起作用。

然后我尝试为 POI 3.10 创建包装包,但也无济于事。 同样的错误。

Caused by: java.lang.ClassNotFoundException: org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl not found by org.apache.poi [8]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
... 105 more

后续调用会导致以下结果:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument
at org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument$Factory.parse(Unknown Source)
at org.apache.poi.xssf.model.ThemesTable.<init>(ThemesTable.java:44)
... 93 more

XMLBeans 可以作为一个包导出它的所有包,我已经尝试了 ServiceMix 包以及从 POI 3.10 包含的 jar 中制作一个包。

有人可以指导我完成创建可以处理 Excel 2007+ XML 文档的工作 OSGI 包的过程吗? 非常感谢帮助。

问题是来自org.apache.poi.ooxml-schemas的类调用Class.forName("org.apache.xmlbeans.impl.schema") ,所以你需要在你的 ooxml-schemas 清单中导入这个包捆。

我通过在构建 ooxml-schemas 包时将<DynamicImport-Package>*</DynamicImport-Package>maven-bundle-plugin的配置来解决它。

我们使用一个合并poipoi-ooxmlpoi-ooxml-schemas来解决类加载问题。

为此,我们将 Gradle 与bnd-platform 结合使用 它允许基于 Maven 依赖项构建和调整 OSGi 包。 也可以轻松地将 JAR 合并到组合包中。

我在 GitHub 上设置了一个带有 Apache POI 包(以及其 POM 定义的依赖项)的示例构建 它是为基于 OSGi 的应用程序构建完整目标平台的摘录或自己的配置。

您可以克隆它( sample-poi分支)并尝试运行./gradlew clean bundles 创建的包将在build/plugins

Caused by: java.lang.ClassNotFoundException:
  org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl
  not found by org.apache.poi [8]

这意味着,包内代码org.apache.poi外观类SchemaTypeSystemImpl包的org.apache.xmlbeans.impl.schema并不能找到它。 鉴于类和包看起来都像实现类,我假设它们不能在包外访问是正确和正确的。

您能否为第一个异常添加完整的堆栈跟踪,以便Class.forName()的调用站点可见? 这很可能只是配置问题的下游,但这将有助于缩小问题的范围。

通过将以下包添加到运行包中,我能够在 OSGi 中使用 poi 库:
* org.apache.servicemix.bundles.poi
* org.apache.servicemix.bundles.xmlbeans
* Commons-collections4
* 公共压缩
* commons-math3
* 撒克逊 DOM 8.9.0.4-osgi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM