Apache Jena を使用する OSGi ベースのアプリケーションを作成しようとしています。jena-core とその依存関係をインライン化し、関連パッケージ (com.hp.hpl.jena.*) をエクスポートする Jena バンドルを作成しました。プロジェクトの全体的な構造は次のようになります。
- Jena を含むバンドル
- 内部 API を含むバンドル
- API で定義されたサービスを実装するバンドル
- これらのサービスを提供する WAR バンドル RESTful Web サービス
Glassfish の autodeploy フォルダーへの Jena バンドルのロードは正常に機能し、正常にロードされたことがログに報告されます。ただし、バンドルを使用してサーバーを再起動すると、次の例外が発生します。
INFO: WEB0169: Created HTTP listener [http-listener-1] on host/port [0.0.0.0:8080]
INFO: WEB0169: Created HTTP listener [http-listener-2] on host/port [0.0.0.0:8181]
INFO: WEB0169: Created HTTP listener [admin-listener] on host/port [0.0.0.0:4848]
INFO: WEB0171: Created virtual server [server]
INFO: WEB0171: Created virtual server [__asadmin]
SEVERE: Digester.getParser:
java.lang.ClassCastException: org.apache.xerces.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory
at javax.xml.parsers.SAXParserFactory.newInstance(SAXParserFactory.java:126)
at org.apache.tomcat.util.digester.Digester.getFactory(Digester.java:526)
at org.apache.tomcat.util.digester.Digester.getParser(Digester.java:730)
at org.apache.catalina.startup.ContextConfig.createContextDigester(ContextConfig.java:647)
at org.apache.catalina.startup.ContextConfig.<clinit>(ContextConfig.java:187)
at com.sun.enterprise.web.EmbeddedWebContainer.createContext(EmbeddedWebContainer.java:217)
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1832)
...
Jena バンドル内の Xerces パーサーが、Glassfish の Xerces と競合しているようです。バンドル内の POM ファイルは次のようになります。
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.2.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Export-Package>com.hp.hpl.jena.*;org.apache.log4j;org.apache.log4j.*;org.slf4j;org.slf4j.*</Export-Package>
<Embed-Dependency>*;scope=!runtime|provided;type=!pom;inline=true</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
<!-- fix the weird imports -->
<Import-Package>!com.ibm.uvm.tools,!com.sun.*,!javax.jmdns,!javax.jms,!javax.jms.*,!javax.microedition.*,!com.google.gson,!org.apache.avalon.framework.*,!org.apache.commons.beanutils,!org.apache.commons.codec.binary,!org.apache.commons.collections,!org.apache.commons.digester,!org.apache.commons.digester.*,!org.apache.commons.jexl2,
!org.apache.commons.jxpath,!org.apache.commons.jxpath.*,
!org.apache.commons.vfs2,!org.apache.commons.vfs2.provider,!org.apache.log,!org.apache.xml.*,!org.apache.commons.jxpath
!org.gjt.xpp,!org.jaxen,!org.jaxen.*,!org.relaxng.datatype,
!org.w3c.dom.ls,!org.xmlpull.v1,!sun.io,!sun.misc,!org.gjt.xpp,*
</Import-Package>
</instructions>
</configuration>
</plugin>
OSGI についての私の理解では、エクスポートしたパッケージのみがバンドルの外部に表示され、内部パッケージはこのような奇妙な相互作用から保護されています。助言がありますか?