Исключение Джерси только бросили, когда средства, собранные в одну банку
Я пишу сервер, в который входит Jetty w/Jersey. Когда я запускаю из Eclipse, все отлично. Однако, если я собираю свой сервер и все зависимости в одну банку, используя сборку Maven: единственная цель, я получаю исключение:
Sep 26, 2012 5:35:59 PM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: A message body writer for Java class com.acme.server.webservice.
exception.WebServiceFailure, and Java type class com.acme.server.webserv
ice.exception.WebServiceFailure, and MIME media type application/json was not fo
und
Sep 26, 2012 5:35:59 PM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: The registered message body writers compatible with the MIME media type
are:
*/* ->
com.sun.jersey.server.impl.template.ViewableMessageBodyWriter
17:35:59.372 [qtp184245201-22 - /] ERROR o.a.h.ReflectorServletProcessor - onReq
uest()
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A mess
age body writer for Java class com.acme.server.webservice.exception.WebS
erviceFailure, and Java type class com.acme.server.webservice.exception.
WebServiceFailure, and MIME media type application/json was not found
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerRespons
e.java:285) ~[vma-server-0.0.1-SNAPSHOT-jar-with-dependencies.jar:na]
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequ
est(WebApplicationImpl.java:1457) ~[server-0.0.1-SNAPSHOT-jar-with-dependenc
ies.jar:na]
...
Полная трасса здесь, если она полезна:
https://gist.github.com/3790817
Maven не создает ошибок при создании jar-with-dependencies.
Я новичок в Maven и развертывании Java, и я действительно не уверен, как продолжить отладку.
Кроме того, хотя мне нужно решить эту проблему, я также хотел бы оценить любые предлагаемые варианты работы, так как мне нужно создать исполняемую демонстрацию моего сервера ASAP, которая может быть выполнена с помощью Pointy-Haired Boss (tm) без Eclipse.
Решение:
Основываясь на ответе Павла, я бросил maven-assemly-plugin в пользу maven-shade-plugin. Здесь была настроена конфигурация тени:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<!-- use transformer to handle merge of META-INF/services - see http://java.net/jira/browse/JERSEY-440?focusedCommentId=14822&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#action_14822 -->
<transformer
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
</transformers>
<filters>
<!-- filter to address "Invalid signature file" issue - see http://stackoverflow.com/a/6743609/589215-->
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
Ответы
Ответ 1
Вы не правильно объединяете банки Джерси.
Jersey 1.x использует механизм META-INF/services для обнаружения его компонентов и сборки: один, возможно, просто копирует все в одну банку, переопределяя уже существующие файлы. BUT META-INF/services file (s) должен быть CONCATENATED.
Попробуйте использовать jersey-bundle (com.sun.jersey: jersey-bundle: 1.14) или исправьте свои настройки сборки (или найдите другой плагин чтобы сделать это лучше).
Ответ 2
Не могли бы вы опубликовать свой pom?
Вы отмечаете некоторые зависимости, как предусмотрено?
Это что-то совсем другое, чтобы создать автономное приложение и webapp, поскольку некоторые банки должны быть предоставлены веб-контейнером (tomcat или другим).
Поскольку ваш контейнер "встроен" в ваше приложение (а не ваше приложение в контейнере), возможно, вы не справитесь с этими зависимостями.