【问题标题】:Deploying OSGi Servlet to Domino (IBM presentation) - 404 error将 OSGi Servlet 部署到 Domino(IBM 演示文稿)- 404 错误
【发布时间】:2015-11-19 15:37:22
【问题描述】:

我正在尝试使用带有 Equinox 的 PDE 工具在 Domino 中部署 OSGi 容器。我正在按照此 IBM 幻灯片中的说明进行操作: http://www.slideshare.net/fiorep/domino-osgi-development?next_slideshow=1

但是(根据幻灯片 #52),当我浏览到 http://localhost/simpledemo(在从调试配置中单击调试后)时,我收到“404 文件未找到”错误。

“simpledemo”是在 puligin.xml 文件中映射的别名(幻灯片 44)。然而,servlet 名称是 SimpleServlet。

有什么想法吗? 非常感谢任何帮助。

我的环境:Windows 2012 Server(在 VM 上)、Eclipse 3.6.2、Equinox、PDE 工具和 Domino Server 6.01 服务器。

参考:Deploying OSGi Servlet to Domino

SimpleServlet.Java

 package com.ibm.ls2012;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;

public class SimpleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public SimpleServlet() {

}

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
   final PrintWriter pw = resp.getWriter();

   resp.setContentType("text/html");
   pw.println("<HTML");
   pw.println("<HEAD><TITLE>SHOW112 - Simple Servlet Demo</TITLE></HEAD>");
   pw.println("<BODY>");
   pw.println("<BR>");
   pw.println("hello world. feeling cold yet?");
}}

【问题讨论】:

  • 你做“重启任务http”了吗?此外,显示 web.xml 代码可能很有用。使用pde启动配置绝对可以,我最近做过几次
  • 我已经多次重启了 HTTP 服务器、Domino 服务器和 Windows 2012 服务器。既然你提到了,我实际上没有看到 web.xml 文件。在创建动态 Web 项目时,我已经看到了在新的 Eclipse 版本中创建的选项。我需要一个吗?

标签: osgi lotus-domino equinox domino-designer-eclipse


【解决方案1】:

我要检查的第一件事是插件是否正确加载。从服务器控制台输入:tell http osgi ss {yourpluginname}。确保插件已加载并处于活动状态。如果安装了 state,那么你有一个缺少约束的问题,要诊断,输入 tell http osgi diag {pluginid}。 注意:您可以从第一个 ss 命令中获取 pluginid。

如果状态已解析,则需要使用以下命令手动启动它:tell http osgi start {pluginid}。注意:预计不会处于已解决状态,Domino 服务器应该自动启动所有插件。

【讨论】:

  • 这是一个缺少约束的问题。插件已安装。但是告诉http osgi diag {pluginid}`给了我一个消息Missing Constraint: Bundle-RequiredExecutionEnvironment: JavaSE-1.7". Ill 不得不麻烦解决这个问题!巧合的是,我也在尝试并排运行 Eclipse Mars,但由于“Java 执行环境不存在”而被拒绝。很奇怪,因为 Eclipse 3.6.x 工作正常并且 JAVA_HOME 变量指向 JDK 路径。猜猜告诉 http osgi start {pluginid} 只有在我解决了这个约束问题后才能工作。我真的很感谢你花时间在这件事上,大卫!!
  • 知道在哪里寻找“缺少约束:Bundle-RequiredExecutionEnvironment:JavaSE-1.7”错误吗? JDK 的一切看起来都很好:jdk1.7.0.79 安装在 Program File 中(让 Eclipse Mars 开心),JDK jdk1.7.0.51 安装在 Program Files (x86) 目录中(让 Eclipse 3.6.x 开心)。
  • 我注意到项目 com.ibm.ls2012 和 com.ibm.notes.java.api 的 build.properties 的以下警告(我只是按照幻灯片中的确切名称)---“那里没有 jre.compliitation.profile 构建条目,并且项目设置了 Java 合规性首选项”
  • 通过更改 Manifest.mf(对于 com.ibm.ls2012)的 Bundle-RequiredExecutionEnvironment 属性来帮助激活插件。服务器启动后,它处于惰性状态(manifets.mf 中的 Bundle-ActivationPolicy?)。我能够使用 Start osgi 命令使插件处于活动状态。但是导航到 localhost/simpledemo 会给出一个空白页面,并且不会激活 Eclipse 中的调试器 --- 但是我需要检查的 Domino 服务器控制台中出现了一些 HTTP JVM 错误。
  • HTTP JVM 错误是由于 plugin.xml 中的插件名称拼写错误。返回空白页面,不切换到 Eclipse 调试器。
【解决方案2】:

我遵循了类似的演示,但由于某种原因略有不同。我不确定是否有所改变,或者我是否根据在 Liberty 上的 Vaadin Web 应用程序的经验采取了稍微不同的方法。

我的 plugin.xml 有:

<extension
    point="com.ibm.pvc.webcontainer.application">
    <contextRoot>
       /helloWorldWC
    </contextRoot>
    <contentLocation>
       WebContent
    </contentLocation>
</extension>

这就为“localhost/helloWorldWC/”的插件应用程序提供了一个根目录。

然后,在 WebContent\WEB-INF 中有一个 web.xml 是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <servlet>
        <servlet-name>HelloWorldServlet</servlet-name>
        <servlet-class>com.paulwithers.helloWorld.HelloWorldServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorldServlet</servlet-name>
        <url-pattern>helloWorld</url-pattern>
    </servlet-mapping>
</web-app>

所以这说明了后续 URL 模式为“helloWorld”的任何内容,因此“localhost/helloWorldWC/helloWorld”应该使用 HelloWorldServlet。这在前面的元素中定义为映射到com.paulwithers.helloWorld.HelloWorldServlet 类。您可以将 url-pattern 更改为“*”,然后 localhost/helloWorldWC 将映射到 HelloWorldServlet 类。

要扩展它,而不是指向单个 servlet 类,您可以指向一个扩展 javax.ws.rs.core.Application 的类,该类可以包含一个 getClasses() 方法,该方法返回一个由所有贡献的 servlet 组成的集合。然后每个 servlet 可以有一个 @Path 注释来定义应该使用的路径(我相信这都是标准的 JAX-RS)。这是我在this blog post 的附件中使用的过程。附件使用 OpenNTF Domino API,但您感兴趣的核心元素 - plugin.xml、web.xml、Application 类和 Servlet 类上的注释 - 是标准的。

【讨论】:

  • 我知道混乱在哪里(以及为什么您在谈论 web.xml)。我问的是使用 Equinox 和 PDE 工具进行的第一次部署。我认为您提到的部分从带有 Expeditor Web Container 的幻灯片 59 开始。您是否有机会让 Equinox 部署工作?
  • 是我用于 Equinox 部署的 plugin.xml 文件:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 2012-06-18
  • 2017-07-07
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多