2012-09-26 16 views
25

Escribo un servidor que incluye Jetty w/Jersey. Cuando ejecuto desde Eclipse, todo es genial. Sin embargo, si ensamblo mi servidor y todas las dependencias en un solo frasco utilizando el montaje de Maven: solo objetivo, consigo una excepción:excepción de jersey solo lanzada cuando las dependencias se ensamblan en un solo contenedor

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] 

...

La traza completa está aquí, si es útil: https://gist.github.com/3790817

Maven no arroja ningún error al crear el jar-with-dependencies.

Soy un principiante con Maven y el despliegue de Java, y realmente no estoy seguro de cómo proceder con la depuración.

Además, si bien necesito resolver este problema, también agradecería cualquier solución sugerida ya que necesito producir una demostración ejecutable de mi servidor lo antes posible que un Pointy-Haired Boss (tm) pueda ejecutar sin Eclipse.

Solución:

Sobre la base de la respuesta de Pavel, se me cayó el experto-assemly-plugin en favor del experto-sombra-plugin. Esta es la configuración de colores que funcionó para mí:

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

¿Es posible publicar las dependencias (relacionadas con jersey) definidas en su archivo pom? Tengo el mismo problema, pero ya estoy usando maven-shade-plugin. Cambiar a 'jersey-bundle' resolvió mi problema, pero me gustaría evitarlo y definir solo las dependencias necesarias en mi pom. – Athafoud

+0

Esta solución funcionó para mí. Tenía exactamente el mismo problema. ¡¡¡¡Gracias!!!! – jmsimpson68

Respuesta

22

No está fusionando los frascos de Jersey correctamente.

Jersey 1.x utiliza el mecanismo META-INF/services para descubrir sus componentes y ensamblaje: probablemente solo copie todo en un solo contenedor, reemplazando archivos ya presentes PERO META-INF/services file (s) necesita (n) ser CONCATENADO.

Pruebe usar jersey-bundle (com.sun.jersey:jersey-bundle:1.14) o repare su configuración de ensamblaje (o busque otro complemento para hacerlo mejor).

+1

Gracias, Pavel. Lo lograste. En mi caso, el 'jersey-bundle' presentaba problemas propios, pero tuve éxito al eliminar el complemento' maven-assembly-plugin' y pasar al 'maven-shade-plugin'. Voy a actualizar mi pregunta con extracto POX que hizo el truco. – HolySamosa

+0

¿Podría publicar su pom? – supercobra

+0

Simplemente agregando la dependencia jersey-bundle y conservando el uso de maven-assembly-plugin se arreglaron mis jar-with-dependence. Por lo que vale. – Mafro34

1

¿Podría publicar su pom?

¿Marcas algunas dependencias según lo previsto? Es algo bastante diferente crear una aplicación independiente y una aplicación web, ya que se supone que el contenedor web (tomcat u otro) debe proporcionar algunos recipientes.

Como su contenedor está "incrustado" en su aplicación (y no su aplicación en el contenedor), entonces quizás no administre correctamente estas dependencias.

Cuestiones relacionadas