【发布时间】: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)"..手动注册工作正常..