Поскольку JBoss EAP 6.1 / AS 7.2.0 является модульным и вы можете исключить, какие модули видны вашему веб-приложению, можно ожидать, что будет легко игнорировать встроенную реализацию JAX-RS (Rest Easy 2.3.6) и использовать пользовательский (3.0.6). Однако, к сожалению, это не так. Вы застряли на том, что предлагает официальное руководство, то есть глобальном обновлении Rest Easy — при условии, что никакое другое веб-приложение, работающее на сервере, не будет повреждено при обновлении.
Этого должно быть достаточно, чтобы исключить встроенный Rest Easy и иметь возможность использовать версию, включенную в веб-приложение:
|
1
2
3
4
5
6
7
8
9
|
<!-- jboss-deployment-structure.xml --><?xml version="1.0" encoding="UTF-8"?><jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name="resteasy"/> </exclude-subsystems> </deployment> </jboss-deployment-structure> |
Однако это далеко не работает. Это почти делает работу (хотя некоторые исключения могут быть ненужными):
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<!-- jboss-deployment-structure.xml --><?xml version="1.0" encoding="UTF-8"?><jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name="resteasy"/> </exclude-subsystems> <exclusions> <module name="org.apache.log4j" /> <module name="org.apache.commons.logging"/> <module name="org.jboss.as.jaxrs"/> <module name="org.jboss.resteasy.resteasy-jaxrs"/> <module name="org.jboss.resteasy.resteasy-cdi"/> <module name="org.jboss.resteasy.jackson-provider"/> <module name="org.jboss.resteasy.resteasy-atom-provider"/> <module name="org.jboss.resteasy.resteasy-hibernatevalidator-provider"/> <module name="org.jboss.resteasy.resteasy-jaxb-provider"/> <module name="org.jboss.resteasy.resteasy-jettison-provider"/> <module name="org.jboss.resteasy.resteasy-jsapi"/> <module name="org.jboss.resteasy.resteasy-multipart-provider"/> <module name="org.jboss.resteasy.resteasy-yaml-provider"/> <module name="org.codehaus.jackson.jackson-core-asl"/> <module name="org.codehaus.jackson.jackson-jaxrs"/> <module name="org.codehaus.jackson.jackson-mapper-asl"/> <module name="org.codehaus.jackson.jackson-xc"/> <module name="org.codehaus.jettison"/> <module name="javax.ws.rs.api"/> </exclusions> </deployment> </jboss-deployment-structure> |
Однако только почти. Проблема в том, что исключение javax.ws.rs.api не имеет никакого эффекта. Кажется, что основные API Java EE не могут быть исключены. Тупик.
Кстати, это мои последние зависимости, связанные с jax-rs:
|
1
2
3
4
5
6
|
// resteasyVersion = '3.0.6.Final'compile group: 'org.jboss.resteasy', name: 'jaxrs-api', version: resteasyVersioncompile group: 'org.jboss.resteasy', name: 'resteasy-jaxrs', version: resteasyVersioncompile group: 'org.jboss.resteasy', name: 'resteasy-jackson2-provider', version: resteasyVersion // JSONPcompile group: 'org.jboss.resteasy', name: 'async-http-servlet-3.0', version: resteasyVersion // Required at runtimecompile group: 'org.jboss.resteasy', name: 'resteasy-servlet-initializer', version: resteasyVersion // Required at runtime |
Примерная история неудачных попыток
Я уже не помню точно все тупики, через которые я прошел, но вот примерный обзор исключений, которые я получил при развертывании или во время выполнения.
|
1
|
java.lang.ClassNotFoundException: org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher |
— исправлено скорее всего путем добавления org.jboss.resteasy:async-http-servlet-3.0:3.0.6.Final зависимостей
|
1
|
java.lang.ClassCastException: myapp.rs.RestApplication cannot be cast to javax.servlet.Servlet |
— исправлено, скорее всего, путем добавления org.jboss.resteasy:resteasy-servlet-initializer:3.0.6.Final зависимостей
|
1
|
java.lang.NoSuchMethodError: org.jboss.resteasy.spi.ResteasyProviderFactory.<init>(Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)V |
— исправлено, вероятно, путем добавления большего количества модулей RestEasy / Jackson в список исключений
|
1
|
java.lang.NoSuchMethodError: org.jboss.resteasy.specimpl.BuiltResponse.getHeaders()Ljavax/ws/rs/core/MultivaluedMap; |
— это то, что невозможно исправить; проблема в том, что BuiltResponse из resteasy-jaxrs наследуется от javax.ws.rs.core.Response однако версия этого класса из jaxrs-api-3.0.6.Final.jar игнорируется в пользу Response от JAX-RS 1.1 от модуль /jboss-eap-6.1.0/modules/system/layers/base/javax/ws/rs/api/main/jboss-jaxrs-api_1.1_spec-1.0.1.Final-redhat-2.jar ( /jboss-eap-6.1.0/modules/system/layers/base/javax/ws/rs/api/main/jboss-jaxrs-api_1.1_spec-1.0.1.Final-redhat-2.jar ), в котором отсутствует метод getHeaders и, как уже упоминалось, его нельзя исключить. (Спасибо allprog за намеки на этот конфликт !)
Вывод
Единственный способ использовать более новый JAX-RS — это обновить модули JBoss. Если это сломает некоторые другие веб-приложения, вы застряли.
Извлеченные уроки: серверы приложений с множеством готовых, хорошо интегрированных (?) Функций кажутся привлекательными, но когда вы сталкиваетесь с конфликтующими библиотеками и проблемами загрузки классов, их ценность быстро уменьшается. Начиная с чего-то простого, что вы полностью контролируете, такого как Jettty, возможно, в долгосрочной перспективе будет лучшим решением. Кроме того, запуск нескольких веб-приложений на одном сервере, возможно, был разумным в 2000 году, но в настоящее время не стоит усилий. У нас достаточно дискового пространства и памяти, поэтому повторное использование библиотек неважно, и возможность управлять глобальными настройками для всех приложений в одном месте, безусловно, имеет лучшие альтернативы. Микросервисы FTW!