我一直在试图让Apache POI在OSGi包中工作。这是我尝试过没有运气的历史:
1)我最初尝试使用预先包装的Apache Servicemix POI包。但是,我必须部署许多依赖项,其中许多不需要。即使在添加了Apache POI servicemix(及其依赖项)后,我也遇到了问题,但我仍然遇到了缺少类的问题。
2)由于第一个解决方案中不需要的东西,我决定将捆绑包内的依赖关系包装起来。基本上我有一个Blueprint服务,它充当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。如果有人有任何建议我会非常感谢你的帮助。
答案 0 :(得分:1)
这是用于创建XLSX导出的工作POI osgi包的pom.xml。也许某些奇特的功能因为可选导入而不是100%支持,但它适用于标准导出。
apache commons bundle是osgi兼容的,所以如果你使用这些依赖项,它必须工作(其他功能使用一些公共,所以不是所有的都需要)。这些功能在我们的karaf功能文件中,但您可以在任何OSGi容器中使用来自给定maven原点的包。
<feature name="stax" version="2.4.0">
<bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.stax-api-1.0/2.4.0</bundle>
<bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.jaxb-api-2.2/2.4.0</bundle>
</feature>
<feature name="repo-apache-commons" version="1.0.0">
<bundle>mvn:commons-beanutils/commons-beanutils/1.9.2</bundle>
<bundle>mvn:commons-collections/commons-collections/3.2.1</bundle>
<bundle>mvn:commons-io/commons-io/2.4</bundle>
<bundle>mvn:org.apache.commons/commons-pool2/2.4.2</bundle>
<bundle>mvn:org.apache.commons/commons-dbcp2/2.1.1</bundle>
<bundle>mvn:commons-codec/commons-codec/1.9</bundle>
</feature>
<feature name="repo-bouncycastle" version="1.46">
<bundle>mvn:org.bouncycastle/bcprov-jdk16/1.46</bundle>
<bundle>mvn:org.bouncycastle/bcmail-jdk16/1.46</bundle>
<bundle>mvn:org.bouncycastle/bctsp-jdk16/1.46</bundle>
</feature>
的pom.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<version>3.13.1</version>
<properties>
<poi.version>3.13</poi.version>
<poi.schema.version>1.1</poi.schema.version>
<poi.security.version>1.0</poi.security.version>
</properties>
<groupId>org.yourgroupid</groupId>
<artifactId>osgi-apache-poi</artifactId>
<packaging>bundle</packaging>
<name>osgi-apache-poi</name>
<description>Apache poi framework</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<_exportcontents>
org.apache.poi.*;version=${poi.version},
org.openxmlformats.schemas.*;version=${poi.schema.version},
schemasMicrosoftComOfficeExcel.*;version=${poi.schema.version},
schemasMicrosoftComOfficeOffice.*;version=${poi.schema.version},
schemasMicrosoftComOfficePowerpoint.*;version=${poi.schema.version},
schemasMicrosoftComVml.*;version=${poi.schema.version},
org.etsi.uri.*;version=${poi.security.version}
</_exportcontents>
<Import-Package>
com.sun.javadoc;resolution:=optional,
com.sun.tools.javadoc;resolution:=optional,
org.apache.crimson.jaxp;resolution:=optional,
org.apache.tools.ant;resolution:=optional,
org.apache.tools.ant.taskdefs;resolution:=optional,
org.apache.tools.ant.types;resolution:=optional,
junit.framework.*;resolution:=optional,
junit.textui.*;resolution:=optional,
org.junit.*;resolution:=optional,
org.apache.xml.security.*;resolution:=optional,
org.apache.jcp.xml.dsig.internal.dom.*;resolution:=optional,
*
</Import-Package>
<DynamicImport-Package>
org.apache.xmlbeans.*,
schemaorg_apache_xmlbeans.*
</DynamicImport-Package>
<!-- bundle supplied resource prefixes -->
<Include-Resource>{maven-resources}</Include-Resource>
<!-- Do not inline jars, include as jar files -->
<!-- There are config files with same name will be overwritten -->
<Embed-Dependency>*;scope=compile;inline=false</Embed-Dependency>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- Embedded dependencies -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>${poi.schema.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-security</artifactId>
<version>${poi.security.version}</version>
</dependency>
</dependencies>
答案 1 :(得分:0)
除了上面的回答,我也想出了我的问题。我没有运行单元测试来调试,而是创建了karaf实例pax。日志中有更多花絮指向我缺少包导入。一旦我添加了丢失的导入,原始错误就消失了。
答案 2 :(得分:-1)
尝试添加此功能,它适用于我
<dependency>
<groupId>stax</groupId>
<artifactId>stax-api</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>stax</groupId>
<artifactId>stax</artifactId>
<version>1.2.0</version>
</dependency>
maven bundle插件无法自动找到依赖项stax:stax:1.2.0,此外你可能需要手动导出包com.bea。*
以下是使用bnd https://github.com/stempler/bnd-platform-minimal
的osgi-fied apache poi的例子将build.gradle修改为以下代码:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.standardout:bnd-platform:1.2.0'
// uncomment line below if using Gradle 1.x
// classpath 'org.codehaus.groovy:groovy-backports-compat23:2.3+'
}
}
apply plugin: 'org.standardout.bnd-platform'
/* XXX Problem with new plugin notation: dependency of bnd-platform is not resolved correctly / cannot be loaded as plugin
plugins {
id "org.standardout.bnd-platform" version "1.2.0"
}
*/
repositories {
mavenCentral()
}
defaultTasks 'clean', 'updateSiteZip'
platform {
fetchSources = true
determineImportVersions = true
override {
optionalImport(
// no version requirement for certain JRE provided packages
// use wildcards to not enforce imports
'javax.xml.*',
// also make JUnit optional everywhere - so we can exclude it from products
'junit.framework.*',
'org.junit.*'
)
}
def poiVersion = '3.15'
feature id: 'org.apache.poi.osgi',
name: 'Apache POI OSGI All In One',
version: poiVersion, {
// merged POI bundle
merge(failOnDuplicate: false) {
bundle "org.apache.poi:poi:$poiVersion"
bundle "org.apache.poi:poi-ooxml:$poiVersion"
bundle "org.apache.poi:poi-ooxml-schemas:$poiVersion"
bundle "org.apache.xmlbeans:xmlbeans:2.6.0"
bundle "com.github.virtuald:curvesapi:1.04"
bundle "commons-codec:commons-codec:1.10"
bundle "org.apache.commons:commons-collections4:4.1"
bundle "stax:stax-api:1.0.1"
bundle "stax:stax:1.2.0"
bnd {
symbolicName = 'org.apache.poi'
bundleName = 'Apache POI'
version = poiVersion
// only provide poi packages as exported packages
instruction 'Export-Package', "org.apache.poi.*;version=$version, com.bea.*"
instruction 'Private-Package', '*'
// don't import any poi packages
prependImport '!org.apache.poi.*', '!org.apache.xmlbeans.*', '!com.graphbuilder.*', '!org.apache.commons.codec.*'
}
}
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.2'
}
运行./gradlew clean bundles updateSite
为osgi-fied apache.poi生成你的包和repo