Исключение Джерси выдается только тогда, когда зависимости собраны в одну банку.

Я пишу сервер, который встраивает 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-dependency.

Я новичок в Maven и развертывании Java, и я действительно не знаю, как продолжить отладку.

Кроме того, хотя мне нужно решить эту проблему, я также был бы признателен за любые предложенные обходные пути, поскольку мне нужно как можно скорее создать исполняемую демонстрацию моего сервера, которую Pointy-Haired Boss (tm) может выполнить без Eclipse.

Решение:

Основываясь на ответе Павла, я отказался от плагина maven-assemly в пользу плагина maven-shade. Вот конфигурация тени, которая сработала для меня:

        <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>

person HolySamosa    schedule 26.09.2012    source источник
comment
Можно ли опубликовать (связанные с трикотажем) зависимости, определенные в вашем файле pom? У меня такая же проблема, но я уже использую плагин maven-shade. Переключение на jersey-bundle решило мою проблему, но хотелось бы избежать этого, определяя только необходимые зависимости в моем pom.   -  person Athafoud    schedule 26.04.2015
comment
Это решение сработало для меня. У меня была точно такая же проблема. Спасибо!!!!   -  person jmsimpson68    schedule 13.07.2015


Ответы (2)


Вы неправильно объединяете банки из Джерси.

Джерси 1.x использует механизм META-INF/services для обнаружения своих компонентов и сборки: single, вероятно, просто копирует все в один jar, переопределяя уже существующие файлы, НО META-INF/services файл(ы) необходимо ОБЪЕДИНИТЬ.

Попробуйте использовать jersey-bundle (com.sun.jersey:jersey-bundle:1.14) или исправьте настройки сборки (или найдите другой плагин, который сделает это лучше).

person Pavel Bucek    schedule 27.09.2012
comment
Спасибо, Павел. Ты сделал это. В моем случае jersey-bundle представил свои собственные проблемы, однако мне удалось удалить плагин maven-assembly-plugin и перейти к maven-shade-plugin. Я обновлю свой вопрос с выдержкой POX, которая помогла. - person HolySamosa; 27.09.2012
comment
Не могли бы вы опубликовать свой помпон? - person supercobra; 07.09.2014
comment
Простое добавление зависимости jersey-bundle и сохранение использования плагина maven-assembly-plugin исправили мою банку с зависимостями. Для чего это стоит. - person Mafro34; 17.11.2014

Не могли бы вы опубликовать свой помпон?

Отмечаете ли вы некоторые зависимости как предоставленные? Создание автономного приложения и веб-приложения — это совсем другое, поскольку некоторые jar-файлы должны предоставляться веб-контейнером (tomcat или другим).

Поскольку ваш контейнер «встроен» в ваше приложение (а не ваше приложение в контейнер), возможно, вы неправильно управляете этими зависимостями.

person Samuel EUSTACHI    schedule 27.09.2012