【问题标题】:service provider and OSGI issue服务提供商和 OSGI 问题
【发布时间】:2012-02-03 12:23:48
【问题描述】:

我编写了一个 osgi 包,其中我有一个 jar(bsf-all.jar) 的依赖项,其中包含如下服务提供者(在 META_inf/services/ 下);

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

这个特定的类在我的依赖 jar(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 以克服上述问题?

【问题讨论】:

  • bsf-all.jar 是 OSGi 捆绑包(意思是:它有 META-INF/MANIFEST.MF 文件)吗?
  • 服务提供者无法在 OSGi 中工作,但您可以通过手动设置这些脚本引擎来使用它们 ScriptEngineFactory.registerEngineName(String name) - 您最好尝试在时间。此外,不要嵌入所有内容,而是尝试将它们包装为单独的 Jars(即将每个单独的依赖项转换为一个包,请参阅 pax-wrap)。
  • "服务提供者不能在 OSGi 中工作,但是您可以通过手动设置这些脚本引擎来使用它们 ScriptEngineFactory.registerEngineName(String name)"..手动注册工作正常..

标签: maven osgi equinox


【解决方案1】:

我觉得这个POM中有太多根本性的错误,无法开始猜测CNFE的原因。您的&lt;Export-Package&gt; 声明是最受关注的。为什么要在捆绑包中重新打包和导出整个 BSF、Rhino、Phobos 甚至部分 JDK??

正如我在对您之前的问题的回答中所暗示的那样:您陷入了低级别的细节中,而我认为,您并没有很好地了解您在高级别上要实现的目标。因此,即使有人发布了一个让您解决此特定问题的答案,您仍然不会有一个有效的架构。

请退后一步,概括地描述您想要实现的目标以及原因。然后我们可以提供基于良好 OSGi 实践的解决方案。

【讨论】:

  • 据我所知; “ 指令是要导出的捆绑包的列表”..在我的情况下,我的后端需要导出的包..(那些导出的包在依赖项 jar 中定义(即:bsf -all.jar)。所以,我尝试显式导出它们,以便我的其他包访问..这是错的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2016-08-23
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2019-02-20
相关资源
最近更新 更多