【发布时间】:2016-03-08 11:07:14
【问题描述】:
我一直在努力让 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。如果有人有任何建议,我将不胜感激。
【问题讨论】:
-
不确定这里为什么提到 POI。它似乎根本不涉及异常。
-
谢谢吉姆,我把它包括在内是因为有几个关于这个问题的相关帖子,特别是关于 POI。我将删除标签,因为堆栈确实明确指向 pax 检查。
-
哪个包应该提供
com.bea.xml.stream.EventFactory?为什么要引用它?这不是您通常期望javax.xml.stream.XMLEventFactory.newInstance()加载的内容。您使用的是哪个测试容器?以及哪个版本的 Pax Exam?尝试将您的问题缩小到 XML 内容。它似乎根本与 POI 或 Pax Exam 无关。 -
谢谢哈拉尔德。根据我在网上收集的信息,POI 库依赖于 stax,它负责提供 com.bea.xml.stream.EventFactory。我将它添加到我的依赖项中,但仍然出现相同的错误。我正在使用 Karaf 测试容器,版本 4.6.0。
标签: java apache-karaf osgi-bundle pax-exam