Использование веб-сервиса Jersey 2.x в Weblogic 12.1.1
Я пытаюсь развернуть веб-сервисы Jersey 2.13 в Weblogic 12.1.1. Эта версия weblogic соответствует спецификации JSR-311 JAX-RS 1.1, тогда как Jersey 2.x обеспечивает реализацию для JAX-RS 2.0.
У Oracle есть инструкция по обновлению версии JAX-RS RI на Джерси: http://docs.oracle.com/cd/E24329_01/web.1211/e24983/version.htm
Однако даже это не помогает решить все проблемы развертывания.
Я упаковываю заявку в EAR, содержащую WAR. Чтобы переопределить jar- файлы weblogic, я добавил следующий файл 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. *, Добавив его в предпочитаемые пакеты приложений, я получаю новые ошибки, и это продолжается вечно...
Кто-нибудь мигрировал Джерси до версии 2.x на weblogic 12.1.1 или ниже?
Спасибо!
4 ответа
В конце концов оказалось, что вам на самом деле нужно заменить больше банок, чем предлагает Oracle. Вот как выглядит мой 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>
Надеюсь, поможет.
Для тех, кто хотел бы использовать еще более новую версию Джерси (работает с 2.15 до 2.20, которая в настоящее время находится в версии SNAPSHOT), это еще одна версия weblogic.xml
, Обратите внимание, что этот набор имен пакетов определяется одной зависимостью от
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
</dependency>
файл weblogic.xml
(включает в себя также ресурсы, которые не описаны в ответе Андрея Бавта и даже в официальном документе):
<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.22.
Weblogic 12.1.3 использует версию Джерси 1.18. Чтобы перейти на другую, вы можете развернуть Jersey 2.x как библиотеку в Weblogic и предоставить к ней общий доступ с вашими приложениями или настроить Weblogic для использования Jersey из вашего приложения с помощью weblogic.xml.
В моем случае я выбираю второй вариант:
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>
Я создал простой проект maven для создания файла war с общей библиотекой jersey 2.19 для weblogic.
Вы можете клонировать отсюда weblogic-jax-rs
После клонирования беги mvn package
произвести войну, а затем развернуть ее на сервере
Начиная с weblogic 12.2.1 - с ним связан джерси 2.21.1, поэтому никаких дополнительных установок не требуется.
WebLogic 12.2.1.1 поставляется с Джерси 2.22.1