【问题标题】:JAX-RS Jersey 2.10 support in Websphere 8Websphere 8 中的 JAX-RS Jersey 2.10 支持
【发布时间】:2014-09-01 07:48:14
【问题描述】:

我正在尝试在 Websphere 8 中使用 Jersey 2.10,但它尝试引用作为 JAX-RS 1.1 实现的应用程序(默认 Wink) 即使我通过设置 IBM 属性禁用了 JAX-RS 默认值,我也会收到以下错误。

引起:java.lang.NoSuchMethodError: javax/ws/rs/core/Application.getProperties()Ljava/util/Map; 在 org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:287) 在 org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:311)

我读过一篇文章,说要为 PARENT_LAST 制定类加载策略。在 WAS 控制台上禁用了更改该选项,因此我尝试使用(WAS 的发布设置 - 使用服务器上的资源运行服务器)并且我的服务器崩溃了。

请指教。 谢谢。

【问题讨论】:

    标签: jersey websphere jax-rs


    【解决方案1】:

    您需要执行以下步骤:

    通过 JVM 属性 com.ibm.websphere.jaxrs.server.DisableIBMJAXRSEngine=true 禁用内置 JAX-RS,请参阅描述 here
    您可以通过 Servers > WebSphere Application Servers > yourServerName 中的 Web 管理控制台设置此属性。然后在Server Infrastructure 部分Java and Process Management > Process definition > Java Virtual Machine > Custom properties

    使用所有 JAX-RS 2.10 库在控制台中通过 Environment > Shared Libraries 创建 isolated 共享库。

    创建库时,通过检查Use an isolated class loader for this shared library Class Loading 选项创建隔离共享库。

    在安装期间或稍后通过Applications > appName > Shared library references 将此共享库映射到您的应用程序。

    重启应用服务器。在 SystemOut.log 中,您应该会看到消息正在初始化 JAX-RS 类:

    [7/12/14 16:10:36:470 CEST] 0000004a JerseyServlet I   Registering the Jersey servlet application, named javax.ws.rs.core.Application, with the following root resource and provider classes: [class jax.Hello, class org.glassfish.jersey.server.wadl.internal.WadlResource]
    [7/12/14 16:10:36:688 CEST] 0000004a ApplicationHa I   Initiating Jersey application, version Jersey: 2.10.1 2014-06-30 13:53:32...
    

    更新

    似乎也可以从 WAR 中加载 JAX-RS jar。您必须设置此DisableIBMJAXRSEngine 属性,并且需要将模块(不在EAR 级别)类加载器中的类加载选项更改为Classes loaded with local class loader first (parent last)

    在管理控制台中:

    应用程序 > WebSphere 企业应用程序 > {your.application} > 管理模块 > {your.module}

    将类加载器顺序下拉菜单更改为:Classes loaded with local class loader first (parent last)

    感谢 dooffas 的检查,请参阅 JAX-RS 2.0 WebSphere 8.5 without isolated shared library

    【讨论】:

    • 推荐设置有效,Jersey 2.5 已启动并运行。它在网络部署中如何工作?这些共享库是否位于已部署应用程序之外的物理位置?如果是这样,那就很难了。请告知是否有任何替代方案。
    • 是的,您需要将共享库放置在运行应用程序的服务器的所有节点上的相同位置。替代方案 - 您可以考虑是否真的需要 2.x JAX-RS :)。 Java EE 6 需要 1.1,WAS 完全支持该版本。如果您使用第三方实现并在其中发现任何错误,IBM 将不支持。另一种选择可能是尝试使用来自 8.5.5 的轻量级 WebSphere Liberty 配置文件,默认情况下它没有 JAX-RS 库,因此您可以在应用程序中提供它们。我知道这不是你所指望的。
    • 是否可以通过 MANIFEST.MF 文件关闭 JAX-RS 引擎?可以关闭 JAX-WS 引擎。我想使用应用程序提供的 JAX-RS,而不修改应用程序服务器。
    • 谢谢!是否可以设置参数并避免创建共享库,而是将 JAX-RS 2.0 jar 打包到我的应用程序战争中?设法更改参数,重新启动 WebSphere,并尝试从我的应用程序加载 JAX-RS,但由于问题异常而失败。
    • @Gas 感谢您的澄清!我想我将不得不探索共享库方法。我们将与容器无关的软件分发给客户,然后他们必须在自己的环境中进行部署。共享库不是我们以前必须做的事情,对于我们的 websphere 客户来说,每个额外的配置/部署步骤都意味着对我们来说一个潜在的支持问题——另一方面,支持 jaxrs 1.1 需要重新考虑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2014-01-24
    • 2016-12-02
    相关资源
    最近更新 更多