服务提供商和OSGI问题

时间:2012-01-05 17:05:13

标签: maven osgi equinox

我编写了一个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以克服上述问题?

1 个答案:

答案 0 :(得分:4)

我觉得这个POM中存在太多基本错误,无法开始推测CNFE的原因。您的<Export-Package>声明最受关注。为什么要重新打包并导出整个BSF,Rhino,Phobos甚至是你的软件包中的部分JDK?

正如我在回答你之前提出的问题时暗示的那样:你在低级别的细节中陷入困境,我认为,他们并没有很好地理解你在高层次上想要达到的目标。因此,即使有人发布了一个让你超越这一特定问题的答案,你仍然没有一个有效的架构。

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