我一直在努力让 Apache POI 在 OSGi 包中工作。这是我没有运气尝试过的历史:
1) 我最初尝试使用预包装的 Apache Servicemix POI 包。但是,这有许多我必须部署的依赖项,其中许多是不需要的。即使在添加了 Apache POI servicemix(及其依赖项)之后,我还是碰壁了,我仍然遇到缺少类的问题。
2)由于第一个解决方案中不需要的东西的数量,我决定将依赖项包装在一个包中。基本上我有一个蓝图服务,它充当 POI 功能的包装器。所有单元测试都运行良好,但我的 pax 考试测试失败了。
起初,它找不到作为依赖项的类(commons-codec、xmlbeans 等)。所以我添加了 POI 和 POI OOMXL 依赖项以及它需要的所有其他依赖项。这解决了大多数类加载器问题。然而,这是我目前坚持的一个。捆绑包启动得很好,但是一旦它尝试创建一个 excel 工作簿,它就会失败并显示以下堆栈跟踪:
java.lang.ClassNotFoundException: com.bea.xml.stream.EventFactory not found by org.ops4j.pax.exam.rbc [104]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1574)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:68)
at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:178)
at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:92)
at javax.xml.stream.XMLEventFactory.newInstance(XMLEventFactory.java:30)
以下是我包括的依赖项:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${apache.poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${apache.poi.version}</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.6.0</version>
</dependency>
似乎 pax 容器找不到 EventFactory。如果有人有任何建议,我将不胜感激。