2014-03-04 33 views
3

我試圖從我的主應用程序訪問OSGI包。但是如果使用javax.xml。*包訪問bundle中的類, NoClassDefFoundError被拋出。訪問標準java類的OSGi包中的NoClassDefFoundError

java.lang.NoClassDefFoundError: javax/xml/transform/Source 
    at de.foo.bar.test.Builder.<init>(Builder.java:46) ~[test-bundle-1.4.0.jar:1.4.0] 
    at de.foo.bar.test.request.Factory.createRequest(Factory.java:99) ~[?:?] 
    at de.foo.bar.test.request.Request.prepareRequest(Request.java:93) ~[?:?] 
    at de.foo.bar.test.request.Request.process(Request.java:60) ~[?:?] 
    at de.foo.bar.test.TestClass.execute(TestClass.java:74) ~[?:?] 
    at de.foo.bar.test.TestClass.execute(TestClass.java:1) ~[?:?] 
    at de.foo.bar.service.system.OsgiTransactionHandler.handleTransaction(OsgiTransactionHandler.java:71) ~[bin/:?] 
    at de.foo.bar.service.system.TransactionRequestService.processTransaction(TransactionRequestService.java:110) ~[bin/:?] 
    at de.foo.bar.service.system.TransactionRequestService.runService(TransactionRequestService.java:72) ~[bin/:?] 
    at de.foo.bar.service.model.InfiniteService.run(InfiniteService.java:57) ~[bin/:?] 
    at com.google.common.util.concurrent.AbstractExecutionThreadService$1$2.run(AbstractExecutionThreadService.java:60) [guava-16.0.1.jar:?] 
    at com.google.common.util.concurrent.Callables$3.run(Callables.java:93) [guava-16.0.1.jar:?] 
    at java.lang.Thread.run(Thread.java:662) [?:1.6.0_43] 
Caused by: java.lang.ClassNotFoundException: javax.xml.transform.Source not found by test-bundle [1] 
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532) ~[org.apache.felix.framework-4.2.1.jar:?] 
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75) ~[org.apache.felix.framework-4.2.1.jar:?] 
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955) ~[org.apache.felix.framework-4.2.1.jar:?] 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ~[?:1.6.0_43] 
    ... 13 more 

我檢查進口包在MANIFEST.MF,可以看到,這個軟件包javax.xml.transform的陳述(我shortend了一點):

Import-Package: com.fasterxml.jackson.core;resolution:=optional,com.fast 
... 
500;resolution:=optional,javax.servlet;resolution:=optional,javax.sql;r 
esolution:=optional,javax.swing;resolution:=optional,javax.xml.bind;res 
olution:=optional,javax.xml.bind.annotation;resolution:=optional,javax. 
xml.bind.annotation.adapters;resolution:=optional,javax.xml.parsers;res 
olution:=optional,javax.xml.transform;resolution:=optional,javax.xml.tr 
ansform.stream;resolution:=optional,javax.xml.validation;resolution:=op 
tional,org.bson;resolution:=optional,org.lightcouch;resolution:=optiona 
l,org.osgi.framework;resolution:=optional;version="[1.5,2)",org.osgi.fr 
amework.wiring;resolution:=optional,org.w3c.dom;resolution:=optional,or 
g.xml.sax;resolution:=optional,sun.misc;resolution:=optional 

我使用Apache的菲利克斯在4.2.1版本中作爲一個嵌入式框架和行家束-插件配置如下:

<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <extensions>true</extensions> 
    <configuration> 
     <instructions> 
      <Bundle-Name>Test Bundle</Bundle-Name> 
      <Bundle-Activator>de.foo.bar.test.activator.TestActivator</Bundle-Activator> 
      <Service-Component>OSGI-INF/component.xml</Service-Component> 
      <Export-Package>de.foo.bar.test</Export-Package> 
      <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
      <Import-Package>*;resolution:=optional</Import-Package> 
      <Embed-Transitive>true</Embed-Transitive> 
      <Embed-Dependency>*;scope=compile|runtime;inline=false;artifactId=!org.osgi.core</Embed-Dependency> 
      <_failok>true</_failok> 
      <_nouses>true</_nouses> 
      <_nodefaultversion>true</_nodefaultversion> 
      <_snapshot>${osgi-version-qualifier}</_snapshot> 
     </instructions> 
    </configuration> 
</plugin> 

我嘗試用FRAMEWORK_SYSTEMPACKAGES_EXTRA財產缺少的包出口。但是這似乎導致導出所有Java包。我已經停止在第七包。

有沒有辦法提供這些Java標準包而不顯式導出它們?

+0

有趣的問題。我可以建議的是,你可以快速瀏覽jboss,AS7 +使用OSGi來處理所有事情,也是基礎包,也許你可以看到他們是如何做到的。 – nablex

+0

Equinox具有標準JRE的配置文件,以便系統捆綁包導出典型的包。儘管費利克斯有類似的機制,但我會。 –

+0

@BJHargrave你有鏈接到這些Equinox配置文件的站點嗎? – sebastian

回答

0

此問題的原因位於框架配置中。基於在線教程中,我又增加了以下參數添加到我的配置:

config.put(Constants.FRAMEWORK_SYSTEMPACKAGES, "org.osgi.framework; version=1.5.0"); 

這導致了默認的系統軟件包已被替換,只有org.osgi.framework已面世,除了我出口的額外的軟件包。

我刪除了這行後,默認的包再次可用,所以再javax.xml.transform。