【发布时间】:2011-11-07 14:18:56
【问题描述】:
我正在尝试从 Java Web 应用程序调用 OSGi 包的方法。两者都应该在 Tomcat 7 上运行。
我已经编写了一个从 OSGi 包调用方法的普通 Java 应用程序,如本网站所述:http://drupal.osgibook.org/node/37。
为了获得 Equinox 环境的上下文,我从应用程序中启动它并从内部安装包。此外,上下文用于检索正在运行的捆绑包的服务引用并获取其服务。
EquinoxRunner类的runEquinox方法:
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
public BundleContext runEquinox([...]) throws Exception {
[...]
BundleContext bundleContext = EclipseStarter.startup(new String[]{"-console"}, null);
bundleContext.installBundle("file:C:/.../plugins/myosgiclass.interface_1.0.0.201108301327.jar");
Bundle bundleTranslationImpl = bundleContext.installBundle("file:C:/.../plugins/myosgiclass.impl_1.0.0.201108301327.jar");
bundleTranslationImpl.start();
[...]
return bundleContext;
}
以及ServiceRunner类的invokeMethod:
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
[...]
public Object invokeMethod(BundleContext bundleContext, Object value, [...]){
ServiceReference serviceReference = bundleContext.getServiceReference(MyOSGiClass.class.getName());
Object result = null;
if (serviceReference != null) {
MyOSGiClass myOSGiClass = (MyOSGiClass) bundleContext.getService(serviceReference);
if (myOSGiClass != null) result = myOSGiClass.method(value);
bundleContext.ungetService(serviceReference);
}
return result;
}
现在,在使用 eclipse bridge 的 Tomcat 上,我不知道如何检索 Equinox 环境的正确上下文。当我尝试使用 Equinox 在 Tomcat 上运行它时,我得到了 NoClassDefFound 异常。我将不胜感激有关如何解决此问题的任何建议。
提前非常感谢。 干杯,尼克
【问题讨论】:
-
我认为关键是控制 OSgi 框架的启动。我不熟悉 Equinox 的确切工作原理,但我确信它们与 Felix 的描述类似,这里:felix.apache.org/site/…
-
感谢您的评论。这也是我尝试过的方法。虽然由于我需要在 Tomcat 服务器上运行我的项目,但似乎需要上述 Bridge - 我无法手动启动。或者有什么方法可以绕过这个 Bridge 并使用手动启动的 OSGi 框架?
-
我不明白使用 Tomcat 如何将您与特定的 servlet 桥实现联系起来。为什么不从自定义
org.eclipse.equinox.servletbridge项目开始呢? -
您是否需要运行 OSGi 框架?也许您只需要将捆绑 jar 文件放在您的 WEB-INF/lib 文件夹中,然后像使用任何其他 jar 一样使用它。捆绑包只是一个 jar,其中包含 jar 清单中的额外信息。任何 OSGi 包都可以作为普通 Jar 文件在 OSGi 之外使用。
-
在许多情况下,我会同意@dlaidlaw 的评论,但最初的问题提到了检索服务引用,因此有问题的包可能具有多个运行时依赖项。试图在 OSGi 框架之外设置这些通常是徒劳的。
标签: java tomcat eclipse-plugin osgi equinox