【问题标题】:How can I load OSGi plugin with import-package "javax.servlet.annotation"如何使用导入包“javax.servlet.annotation”加载 OSGi 插件
【发布时间】:2015-06-23 23:46:27
【问题描述】:

我有一个在 OSGi 中运行的 Web 应用程序并已部署到 Tomcat。我一直在通过在我的插件中为扩展点 org.eclipse.equinox.http.registry 做出贡献并将以下包添加到 manifest.mf 来注册我的 servlet:

Import-Package: javax.servlet,
 javax.servlet.http

到目前为止一切都很好。

现在,我想让我的一个 servlet 支持异步。我试图通过在我的 servlet 类中添加以下注释来做到这一点:

@WebServlet(name = "OrderServlet", urlPatterns = {"/order"}, asyncSupported = true)
public class OrderServlet extends HttpServlet {
...
}

这需要将 javax.servlet.annotation 添加到清单中:

Import-Package: javax.servlet,
 javax.servlet.annotation,
 javax.servlet.http

当我使用此更改重新部署我的 WAR 时,我的插件无法加载。当我尝试手动启动捆绑包时,OSGi 控制台显示以下错误:

id      State       Bundle
5       INSTALLED   abc.asyncServlet_1.0.0
osgi> start 5
gogo: BundleException: The bundle "abc.asyncServlet_1.0.0 [5]" could not be resolved. Reason: Missing Constraint: Import-Package: javax.servlet.annotation; version="0.0.0"
osgi> diag 5
update@plugins/abc.asyncServlet_1.0.0.jar [5]
  Direct constraints which are unresolved:
    Missing imported package javax.servlet.annotation_0.0.0.

我使用的是Tomcat 7,验证了我的tomcat/lib目录下的servlet-api.jar(3.0版)有注解包。

我会错过什么?任何指针表示赞赏!

【问题讨论】:

  • 您使用哪个版本的 Equinox/Servlet 桥接器?旧版本没有导出所有(较新)servlet 包(请参阅this bug)。请避免向cross post提问。

标签: tomcat servlets osgi


【解决方案1】:

您的 osgi 容器可能没有加载 servlet-api.jar 文件。您可能需要在 config.ini 文件中指定 jar,或者在您配置 osgi 容器可用的包的位置指定。

【讨论】:

    【解决方案2】:

    可能包javax.servlet 没有被任何包导出到您的OSGi 容器中。 您可以部署以下导出此包的 OSGi 就绪包:

    <dependency>
       <groupId>org.apache.geronimo.specs</groupId>
       <artifactId>geronimo-servlet_3.0_spec</artifactId>
       <version>1.0</version>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 2012-04-04
      • 1970-01-01
      • 2017-01-16
      • 2015-01-08
      • 1970-01-01
      • 2020-07-15
      • 2016-09-15
      • 2017-04-07
      • 2023-04-08
      相关资源
      最近更新 更多