gpt4 book ai didi

java - 如何将 Eclipse 插件公开为 Web 服务?

转载 作者:行者123 更新时间:2023-11-30 04:56:32 24 4
gpt4 key购买 nike

我一直在研究如何将 Eclipse 插件公开为 Web 服务,但我感到很困惑。

我的要求基本上是为一组 Web 服务构建 Equinox 后端。我将大量使用 EMF 和相关项目,因此考虑到这个目标,我一直在阅读有关 Equinox/OSGI 以及构建我需要的选项的信息。

然而,还是有一些神秘的地方,而且周围有大量的项目。鉴于以下发现,我想听听您的建议。也许我缺少一个选项,或者您以前已经这样做过。这是提名者(鼓乐)

在 Web 容器中托管 Equinox。使用bridge.war,插件可以公开servlet。问题是,要使用良好的 REST 框架,例如 RestEasy(我最喜欢的),REST 框架需要是位于 Equionox 运行时中的 osgi 包。我花了 3 天,由于类加载器问题,这不起作用。我现在确信我将无法在 Equinox 中使用 RestEasy。我可以在 Web 容器中使用 RestEasy,并使用 XML 序列化/反序列化使 Web 容器中的代码与 Equionox 中的代码进行对话,但这感觉像是浪费资源。不过,这可能有效。

另一个选项似乎是ECF,它是分布式OSGI的实现,它似乎支持SOAP/Rest。但是,我找不到仅将 Equinox 托管功能公开为 Web 服务的清晰教程。所以这仍然迫使我不使用 RestEasy,但至少它似乎给了我一个与 Equinox 对话的适当框架。为了可扩展性,我可能仍然需要将其保存在网络容器中。

然后是 Eclipse Virgo,它似乎支持与 OSGI 运行时一起托管 Web 应用程序,并且显然 Web 容器托管代码可以与 OSGI 运行时代码对话。不过,我不确定是否可以传递类,因为在 Web 容器下创建的 Jaxb 带注释的类型 A 可能使用与 OSGI 运行时插件不同的类加载器。另外,这个设置将我锁定在 Virgo,我宁愿使用 JBoss 等进行生产使用。

因此,考虑到这些选项,以及可能还有更多我目前不知道的选项,您将如何将 EMF 和其他基于 Eclipse 框架的项目公开为 Web 服务?

编辑:基于大家的热烈响应,我想补充更多内容。部分是问题的细节,部分是不适合评论部分的评论。

我对这个问题的研究让我得到了与公认答案完全相同的观点:Apache CXF 现在是分布式 OSGI 的实现,这很好。我已经放弃了 RestEasy。我当前担心的是,我已经有一个创建了我的类的 XSD。 RestEasy 使暴露这些变得非常容易,我也必须在这里做同样的事情。我的插件必须使用这些基于 JAXB 的类。在最坏的情况下,我可能会尝试使用提供 JAXB 支持的 Eclipse Link 项目来创建 XML 内容,并通过基本 servlet 使用或作为基于 CXF 的字符串值传递它。因此,这里讨论的解决方案感觉并不完美,但我想这是目前可以做的最好的解决方案。

最佳答案

我开发的产品已经做到了这一点。我们的 Web 容器中有 Equinox。我们使用 Apache CXF 公开 SOAP 和 REST Web 服务。需要一些黑魔法才能正确连接所有东西。我发现 CXF 文档不太好,特别是对于 OSGI。

我相信您知道,在 Web 容器中托管 Equinox 并不是一种推荐的做法,尽管如果您想使用 OSGI,这是很难避免的做法。我们也遇到了许多类加载问题。事实上,我们从未真正享受过 OSGI 所宣传的好处(模块化等)。现在我们想回头已经太晚了。 OSGI 不应轻易进入。

以下是我们如何使用 CXF 启用 SOAP/REST 的快速概述。希望这至少能为您指明正确的方向。

1) 安装 CXF OSGI bundle ,包括核心和 DOSGI - 我们使用以下内容: cxf-bundle-minimal-2.2.12.jar cxf-dosgi-ri-discovery-local-1.1.jar cxf-dosgi-ri-dsw-cxf-1.1.jar 链接: http://cxf.apache.org/download.html

2) 安装 JAX-RS (REST) 和 JAX-WS (SOAP) API- API 定义位于 org.apache.servicemix.specs.jsr311-api-1.0-1.3.0.jar 和 org.apache.servicemix.specs.jaxws-api-2.1-1.1.1.jar 中(这些是版本我们有)- 这些可能会也可能不会与 CXF 捆绑在一起。在我们的例子中,仅包含 JAX-WS jar。我们必须寻找 JAX-RS bundle 。-除了在web应用程序(WEB-INF/eclipse/plugins)中安装 bundle 之外,我们还必须将它们添加到ECLIPSE/plugins目录中进行编译。

3) 告诉 Equinox 加载 CXF 插件。可能还有其他方法可以做到这一点。我们通过 WEB-INF/eclipse/configuration/config.ini 中的条目来完成此操作。-如果此文件存在,请将新 jar 添加到 osgi.bundles 属性中:osgi.bundles=... org.apache.servicemix.specs.jaxb-api-2.1-1.1.1.jar@start, org.apache.servicemix.specs.jaxws-api-2.1-1.1.1.jar@start ,org.apache.servicemix.specs.jsr311-api-1.0-1.3.0.jar@start,\ cxf-dosgi-ri-discovery-local-1.1.jar@5:开始,\ cxf-bundle-minimal-2.2.12.jar@5:开始,\ cxf-dosgi-ri-dsw-cxf-1.1.jar@5:开始

4) 就是这样。您现在应该能够开始编写 SOAP 和 REST 服务。这是 Java 优先的方法(与 XML 模式优先相反)。这意味着您:- 定义Java接口(interface)- 配置 CXF 将您的接口(interface)发布为 REST 或 SOAP 端点。

这是一个非常简单的 REST 示例。它带有标准免责声明,表明它特定于我们的环境。 YMMV。

a) 我们使用声明式服务,因此首先我们在 bundle 的 list 中定义 DS 文件 服务组件:META-INF/ds/helloworld.xmlb) 这是 DS 文件:META-INF/ds/helloworld.xml。 DS 文件定义了 OSGI 包中的服务及其依赖项。为了简洁起见,这些条目已被省略。

<?xml version="1.0"?>
<components xmlns="http://www.osgi.org/xmlns/scr/v1.0.0">

<component name="hello_world_service" xmlns="http://www.osgi.org/xmlns/scr/v1.0.0">

<!-- Defines this as a REST service --->
<property name="service.exported.configs" value="org.apache.cxf.rs"/>
<!-- This is the URI of your REST resource.
It is realtive to the Equinox bridge servlet in your webapp -->
<property name="org.apache.cxf.rs.httpservice.context" value="/helloworld" />
<!-- This is the java interace that will be exposed . You
will use JAX-RS annotations to map these java methods to HTTP verbs. -->
<property name="service.exported.interfaces" value="com.foo.IHelloWorldService"/>
...

</components>

c) 这是接口(interface)类:

package com.foo;

@Path("/greeting")
public Interface IHelloWorldService {

@GET
@Produces("application/xml")
public Greeting getGreeting();

}

public class HelloWorldService implements IHelloWorldService {
@override
public Greeting getGreeting() {
Greeting g = new Greeting();
g.message = "Hello World";
return g;
}
}

d) 因此,一旦一切就绪,您应该能够获取以下 URL:

   /<web-app-name>/bridge/helloworld/greeting

并收到以下响应:

   <Greeting>
<message>Hello World</message>
</Greeting>

祝你好运。希望这会有所帮助。

关于java - 如何将 Eclipse 插件公开为 Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8357716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com