Apache POI,Excel 2007+ XML和OSGI

对于一个项目,我试图使用Apache POI与OSGI一起使用Excel XMLfunction。

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

然后我试图为POI 3.10创build包装器捆绑包,但也无济于事。 同样的错误。

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中取出一个包。

有人可以指导我创build一个可以处理Excel 2007+ XML文档的工作OSGI包的过程吗? 非常感谢。

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

我在构buildooxml-schemas捆绑包时通过将<DynamicImport-Package>*</DynamicImport-Package>maven-bundle-plugin的configuration中来解决这个问题。

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

这意味着bundle org.apache.poi中的代码会查找包org.apache.poi的类SchemaTypeSystemImpl ,并找不到它。 鉴于类和包看起来像实现类,我假设这是正确的,正确的,他们不能在他们的包之外访问。

你可以添加第一个exception的完整堆栈跟踪,以便Class.forName()的调用网站将可见? 这很可能只是configuration问题的下游,但它有助于缩小configuration范围。

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

为此,我们使用Gradle和bnd平台 。 它允许基于Maven依赖关系构build和调整OSGi包。 将JAR合并到一个bundle中也可以轻松完成。

我在GitHub上设置了一个包含Apache POI包 (以及隐含的,POM定义的依赖关系)的示例生成 。 这是为基于OSGi的应用程序构build完整目标平台的摘录或自己的configuration。

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