在 OSGi 中,尝试使用系统导出包中的 类 时获取 ClassNotFoundExceptions

In OSGi , getting ClassNotFoundExceptions while trying to use classes from the system exported packages

我是 OSGi 新手。我正在使用 Eclipse PDE 'Kepler Service Release 2'。

我想让 javax.servlet 包中的 类 可供我的测试客户使用。但是我在尝试创建 ServletException 对象时遇到 NoClassDefFoundError,只是为了测试。

java.lang.NoClassDefFoundError: javax/servlet/ServletException.

这两种方式我都试过了。两者都不工作:

尝试 1:使用系统包

我的 eclipse OSGI 框架中有这些启动参数:

-Dorg.osgi.framework.system.packages.extra=javax.servlet
-Dorg.osgi.framework.system.capabilities="osgi.ee; osgi.ee=\"JavaSE \";version:List=\"1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8\""

我可以在系统包 (0) 中看到这个导出包:javax.servlet; version="0.0.0"[exported] 我是我的捆绑包,我有这个导入包:org.osgi.framework;version="[1.5,2)",javax.servlet.

启动容器时,即使使用标志 -Dorg.osgi.framework.bootdelegation=*,我也无法正常工作。

尝试 2:使用 ExtensionBundle

我的 ExtensionBundle 在其类路径中有 jar javaee-api-6.0.jar 并导出 javax.servlet 包。 但我仍然得到 'java.lang.NoClassDefFoundError: javax/servlet/ServletException'。

我没有任何启动参数。

在扩展包的 Manifest.mf 中: ...

Bundle-ClassPath: .,javaee-api-6.0.jar
导出包:....,javax.servlet,...
片段宿主:system.bundle;扩展:=框架

...

我是不是漏了什么。

提前致谢。

JRE 不包含包 javax.servlet。所以你不能简单地导出它。您可以在 Maven Central 中查看下面的捆绑包。它导出包。还要记住,servlet API 不足以 运行 一个 servlet。您还需要 osgi HTTPService 的实现。可能的实现是:felix http service, org.eclipse.equinox.http.jetty, pax-web。所以更好的解决方案可能是安装其中之一。

javax.servlet:javax.servlet-api:3.1.0