How to create a working OSGI bundle for Apache POI 3.8?

时光毁灭记忆、已成空白 提交于 2019-12-04 23:36:14

问题


My goal is to create an Excel 2007 document (XLSX) in an Eclipse RCP Environment (Excel 2003 is simple). I don't want to place the POI jars inside a /lib folder, instead I want to use a working POI OSGI bundle from my target definition.

All my attempts so far have failed to create a working OSGI bundle of POI 3.8. What I did so far:

  • I merged all relevant JAR files with the Ant zip task:

    • poi-3.8-beta3-20110606.jar
    • poi-ooxml-3.8-beta3-20110606.jar
    • poi-ooxml-schemas-3.8-beta3-20110606.jar
    • poi-scratchpad-3.8-beta3-20110606.jar
  • I ran the bnd tool with the wrap parameter: java -jar biz.aQute.bnd.jar wrap ./poi-3.8-beta3-20110606-merged.jar

  • I had to bundle the jars in the /ooxml-lib folder separately, with bnd:

    • xmlbeans-2.3.0.jar
    • stax-api-1.0.1.jar
    • dom4j-1.6.1.jar
  • This leads to ClassNotFoundExceptions for org.w3c.dom.Node because xmlbeans-2.3.0.jar exports four classes from this package org.w3c.dom. Normally the JavaSE-RuntimeEnvironment would export these.

  • I deleted the org/w3c/dom folder from xmlbeans-2.3.0.jar and rebundled the jar but I got other ClassNotFoundExceptions.

This is where I got so far. I think working with bnd wrap is not enough. Probably I must create a bnd.properties file and have explicit Export-Package/Import-Package statements but which work?

So, has anyone successfully managed to create a working POI 3.8 OSGI bundle?


回答1:


If you don't need that specific version, simply use http://ebr.springsource.com/repository/app/bundle/version/detail?name=com.springsource.org.apache.poi&version=3.0.2.FINAL that page lists it's dependencies etc (which you can also download or reference if you're using Maven/Ivy)

May be http://engroup.sourceforge.net/maven2/engroup/osgi/commons/poi-osgi/3.1/ or http://ebr.springsource.com/repository/app/search?query=poi can provide some inspiration (in the first link there's a maven POM that lists the (bnd) instructions in the bundle plugin section).

Why are you merging the jars? Why not try wrapping each individually?

A second thing to try is to use existing OSGi'd jars of xmlbeans, stax-api and dom4j

Also you can configure what the JRE (system bundle) exports using "org.osgi.framework.system.packages" - so you can choose not to export org.w3c.dom




回答2:


I was able to do after some serious head banging. You can see the POM file over here:

http://servicemix.396122.n5.nabble.com/Apache-Poi-3-7-component-tc4912054.html#a5009396

I had to repackage XMLBeans 2.3.0 and embed in the bundle.

Cheers, Yogesh




回答3:


I don't know about 3.8, but creating working OSGi bundle for 3.7 is quite easy with Bnd.

-classpath: poi-3.7-20101029.jar, 
  poi-ooxml-3.7-20101029.jar,
  poi-ooxml-schemas-3.7-20101029.jar, 
  poi-scratchpad-3.7-20101029.jar
Bundle-Name: Apache POI
Bundle-SymbolicName: org.apache.poi
Bundle-Version: 3.7.0
Bundle-ClassPath: .
Private-Package: *
Export-Package: org.apache.poi.*;-split-package:=merge-first
Import-Package: !org.openxmlformats.schemas*, \
  !schemasMicrosoftComOfficePowerpoint*, \
  !schemasMicrosoftComOfficeWord*, \
  junit*;resolution:=optional, \
  org.apache.commons.logging;resolution:=optional, \
  *
Include-Resource: @poi-3.7-20101029.jar, \
  @poi-ooxml-3.7-20101029.jar, \
  @poi-ooxml-schemas-3.7-20101029.jar, \
  @poi-scratchpad-3.7-20101029.jar



回答4:


If you are interested in a working example of the approach with BND, you can have a look at this project, providing a pom and a bnd file (inspired by Jarek's answer):

https://github.com/evandor/skysail-bundled-libraries/tree/master/skysail.bundles.poi

Running "mvn install" gives you an "OSGi-flavored" POI jar, which can be found as well here:

https://oss.sonatype.org/content/groups/public/de/twentyeleven/skysail/org.apache.poi-osgi/3.8/

You might have to play a bit with the bnd file to make it create the exact OSGi bundle you need (maybe you don't need all the dependencies, or you want to mark them as optional).

You will find all the documentation needed on the bnd homepage. I recommend starting with this page if you haven't used this great tool before.



来源:https://stackoverflow.com/questions/8063336/how-to-create-a-working-osgi-bundle-for-apache-poi-3-8

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!