在Weblogic 12.1.1上使用Jersey 2.x Web服务

时间:2014-10-14 12:43:54

标签: java web-services jersey weblogic jax-rs

我正在尝试将Jersey 2.13 Web服务部署到Weblogic 12.1.1。此版本的weblogic符合JSR-311 JAX-RS 1.1规范,而Jersey 2.x则提供JAX-RS 2.0的实现

Oracle有关于如何升级Jersey JAX-RS RI版本的说明: http://docs.oracle.com/cd/E24329_01/web.1211/e24983/version.htm

然而,即使这样也无助于解决所有部署问题。

我将应用程序打包在包含WAR的EAR中。为了覆盖weblogic jar,我添加了以下 weblogic-application.xml 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
  <prefer-application-packages>
    <!-- apis -->
    <package-name>javax.ws.rs.*</package-name>
    <!-- guava -->
    <package-name>com.google.common.*</package-name>
    <!-- jersey1 providers -->
    <package-name>com.sun.jersey.*</package-name>
    <!-- media providers -->
    <package-name>org.eclipse.persistence.jaxb.rs.*</package-name>
    <package-name>org.codehaus.jackson.jaxrs.*</package-name>
    <!-- wls -->
    <package-name>weblogic.jaxrs.api.client.*</package-name>
    <package-name>weblogic.jaxrs.internal.api.client.*</package-name>
    <package-name>weblogic.jaxrs.dispatch.*</package-name>
    <package-name>weblogic.jaxrs.monitoring.util.*</package-name>

   </prefer-application-packages>
</weblogic-application>

此配置在部署时给出了以下错误消息:

Caused By: java.lang.NoSuchMethodError: org.glassfish.hk2.api.ServiceLocatorFactory.create(Ljava/lang/String;Lorg/glassfish/hk2/api/ServiceLocator;Lorg/glassfish/hk2/extension/ServiceLocatorGenerator;Lorg/glassfish/hk2/api/ServiceLocatorFactory$CreatePolicy;)Lorg/glassfish/hk2/api/ServiceLocator;

如果我试图通过将org.glassfish.hk2。*类添加到 prefer-application-packages 来替换它,我会收到新的错误并且它会一直持续......

是否有人将Jersey迁移到weblogic 12.1.1或更低版本的2.x版本?

谢谢!

4 个答案:

答案 0 :(得分:22)

最后,事实证明你实际上必须更换比甲骨文建议更多的罐子。这是我的weblogic-application.xml的样子:

 <prefer-application-packages>
    <package-name>com.sun.jersey.*</package-name>
    <package-name>org.glassfish.jersey.*</package-name>
    <package-name>org.glassfish.hk2.*</package-name>
    <package-name>org.jvnet.hk2.*</package-name>
    <package-name>jersey.repackaged.org.objectweb.asm.*</package-name>

    <package-name>com.sun.research.ws.wadl.*</package-name>
    <package-name>com.sun.ws.rs.ext.*</package-name>

    <package-name>org.codehaus.jackson.*</package-name>
    <package-name>com.fasterxml.jackson.*</package-name>

    <package-name>org.codehaus.jettison.*</package-name>

    <package-name>javax.ws.rs.*</package-name>

    <package-name>org.objectweb.asm.*</package-name>

    <package-name>antlr.*</package-name>

  </prefer-application-packages>

希望它有所帮助。

答案 1 :(得分:10)

对于那些想要使用更新版本的Jersey(使用2.15到2.20,目前处于SNAPSHOT版本)的人来说,这是weblogic.xml的另一个版本。请注意,这组包名称由单个依赖性

确定
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
</dependency>

文件weblogic.xml(还包括资源,这些内容未在AndreyBavt的答案中提及,甚至在官方文档中也未提及):

<wls:container-descriptor>
    <wls:prefer-application-packages>
        <!-- jsr311 -->
        <wls:package-name>javax.ws.rs.*</wls:package-name>
        <!-- javassist -->
        <wls:package-name>javassist.*</wls:package-name>
        <!-- aop repackaged -->
        <wls:package-name>org.aopalliance.*</wls:package-name>

        <!-- jersey 2 -->
        <wls:package-name>jersey.repackaged.*</wls:package-name>
        <wls:package-name>org.glassfish.jersey.*</wls:package-name>
        <wls:package-name>com.sun.research.ws.wadl.*</wls:package-name>

        <!-- hk2 -->
        <wls:package-name>org.glassfish.hk2.*</wls:package-name>
        <wls:package-name>org.jvnet.hk2.*</wls:package-name>
        <wls:package-name>org.jvnet.tiger_types.*</wls:package-name>
    </wls:prefer-application-packages>

    <wls:prefer-application-resources>
        <wls:resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</wls:resource-name>
        <wls:resource-name>META-INF/services/javax.ws.rs.ext.RuntimeDelegate</wls:resource-name>

        <!-- jersey -->
        <wls:resource-name>META-INF/services/org.glassfish.jersey.*</wls:resource-name>
        <wls:resource-name>org.glassfish.jersey.*</wls:resource-name>
        <wls:resource-name>jersey.repackaged.*</wls:resource-name>

        <!-- hk2 -->
        <wls:resource-name>META-INF/services/org.glassfish.hk2.*</wls:resource-name>
    </wls:prefer-application-resources>
</wls:container-descriptor>

使用Weblogic 12.2.1进行测试

答案 2 :(得分:5)

当我将泽西岛升级到2.22时,我遇到了同样的问题。

Weblogic 12.1.3使用Jersey的1.18版本。要升级到另一个,您可以将Jersey 2.x部署为Weblogic上的库并与您的应用程序共享或配置Weblogic以通过 weblogic.xml 从您的应用程序中使用Jersey。

在我的情况下,我选择第二个选项:

weblogic.xml中:

<prefer-application-packages>
    <package-name>javax.ws.rs.*</package-name>
    <package-name>com.sun.jersey.*</package-name>
    <package-name>org.glassfish.*</package-name>
    <package-name>org.jvnet.hk2.*</package-name>
    <package-name>jersey.repackaged.org.objectweb.asm.*</package-name>
</prefer-application-packages>

答案 3 :(得分:1)

我创建了一个简单的maven项目来生成带有2.19 jersey共享库for weblogic的war文件。
你可以从这里克隆weblogic-jax-rs
克隆后运行mvn package以生成战争,然后将其部署到服务器

从weblogic 12.2.1开始 - 与它捆绑的球衣2.21.1因此不需要额外的安装。

weblogic 12.2.1.1附带球衣2.22.1