2012-01-05 135 views
1

我已经写了一个osgi包,其中我有一个jar包(bsf-all.jar),其中包含服务提供程序的依赖关系如下(在META_inf/services /下);服务提供商和OSGI问题

bsh.engine.BshScriptEngineFactory 
com.sun.script.freemarker.FreeMarkerScriptEngineFactory 
com.sun.script.groovy.GroovyScriptEngineFactory 
com.sun.script.jacl.JaclScriptEngineFactory 
com.sun.script.jaskell.JaskellScriptEngineFactory 
com.sun.script.java.JavaScriptEngineFactory 
com.sun.phobos.script.javascript.RhinoScriptEngineFactory 
com.sun.phobos.script.javascript.EmbeddedRhinoScriptEngineFactory 
com.sun.script.jawk.JawkScriptEngineFactory 
com.sun.script.jelly.JellyScriptEngineFactory 
com.sun.script.jep.JepScriptEngineFactory 
com.sun.script.jexl.JexlScriptEngineFactory 
com.sun.script.jruby.JRubyScriptEngineFactory 
com.sun.script.judo.JudoScriptEngineFactory 
com.sun.script.juel.JuelScriptEngineFactory 
com.sun.script.jython.JythonScriptEngineFactory 
com.sun.script.ognl.OgnlScriptEngineFactory 
org.pnuts.scriptapi.PnutsScriptEngineFactory 
com.sun.script.scheme.SchemeScriptEngineFactory 
com.sun.script.velocity.VelocityScriptEngineFactory 
com.sun.script.xpath.XPathScriptEngineFactory 
com.sun.script.xslt.XSLTScriptEngineFactory 

当我通过OSGI控制台检查我的包的状态,它是积极的,也没有任何相关性问题.. 但是当我尝试使用它(服务器启动并运行后,意味着) 服务器抛出“未找到类“问题;

java.lang.ClassNotFoundException: com.sun.phobos.script.javascript.RhinoScriptEngineFactory 

这个特定类是我的依赖罐子(BSF-all.jar在)和类通过服务提供商暴露.. 我怀疑有使用OSGi和Java服务提供者的类加载问题..

我的pom.xml如下;

<dependencies> 
     <dependency> 
      <groupId>org.apache.bsf</groupId> 
      <artifactId>bsf-all</artifactId> 
      <version>${bsf.version}</version> 
      <optional>true</optional> 
     </dependency> 
    <dependency> 
      <groupId>rhino</groupId> 
      <artifactId>js</artifactId> 
      <version>1.6R7</version> 
      <optional>true</optional> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 

       <extensions>true</extensions> 
       <configuration> 
        <instructions> 
         <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
         <Bundle-Name>${project.artifactId}</Bundle-Name> 
         <Export-Package> 
          org.apache.bsf.*, 
          org.mozilla.javascript.*, 
          org.pnuts.scriptapi.*, 
          com.sun.script.*, 
          com.sun.phobos.script.*, 
          bsh.engine.*, 
          javax.script.*, 
         </Export-Package> 
         <Import-Package> 
          com.sun.*       
         </Import-Package> 
      <DynamicImport-Package>*</DynamicImport-Package> 
      <Embed-Dependency>js;scope=compile|runtime;inline=false;</Embed-Dependency> 
        </instructions> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

我正在使用Equinox OSGi实现..我如何编辑我的pom以克服上述问题?

+0

是一个OSGi包的bsf-all.jar(表示:有一个META-INF/MANIFEST.MF文件)? – thobens 2012-01-06 13:57:03

+1

服务提供者将不能在OSGi中工作,但可以通过手动设置ScriptEngineFactory.registerEngineName(String name)来使用这些脚本引擎 - 您最好一次尝试依赖工作。而不是嵌入所有东西,试着将它们封装成单独的Jars(即将每个单独的依赖关系转换为一个包,参见pax-wrap)。 – earcam 2012-01-09 17:43:18

+0

“服务提供商不会在OSGi中工作,但您可以通过手动将它们设置为ScriptEngineFactory.registerEngineName(String name)”来使用这些脚本引擎“。手动注册可以正常工作.. – Ratha 2012-01-11 06:43:14

回答

4

我觉得在这个POM中有太多的基本错误开始猜测CNFE的原因。您的<Export-Package>声明是最受关注的。你为什么要重新包装和导出整个BSF,Rhino,Phobos甚至是你的捆绑包中的JDK的一部分?

正如我在回答您先前的问题时所暗示的那样:我认为,您已经陷入低层细节,而没有深入了解您想要在高层实现的目标。因此,即使有人发布了一个可以让你经历这个特殊问题的答案,你仍然没有一个工作架构。

请退后一步,在高层次上描述你正在努力实现的目标和原因。然后我们可以提供一个基于良好OSGi实践的解决方案。

+0

据我了解; “指令是要导出的包的包列表”。在我的情况下,导出的包是我的后端需要的......(这些导出的包在依赖项jar中定义(即:bsf -all.jar)。因此,我试图明确地导出它们,以便通过我的其他包进行访问。是不是错误? – Ratha 2012-01-09 11:42:09