2012-09-26 11 views
25

Sto scrivendo un server che incorpora Jetty w/Jersey. Quando eseguo da Eclipse, è tutto fantastico. Tuttavia, se assemblare il mio server e tutte le dipendenze in un unico vaso utilizzando il montaggio di Maven: unico obiettivo, ottengo un'eccezione:Eccezione jersey generata solo quando le dipendenze sono state assemblate in un singolo barattolo

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 traccia completa è qui, se è utile: https://gist.github.com/3790817

Maven non genera errori durante la creazione di jar-with-dependencies.

Sono un debuttante con Maven e l'implementazione di Java e non sono sicuro di come procedere con il debug.

Inoltre, anche se ho bisogno di risolvere questo problema, apprezzerei anche qualsiasi soluzione suggerita poiché ho bisogno di produrre una demo eseguibile del mio server ASAP che un Boss a punta di capelli (tm) possa eseguire senza Eclipse.

Soluzione:

in base alla risposta di Pavel, ho lasciato cadere l'esperto-assemly-plugin a favore di Maven-ombra-plugin. Ecco la configurazione del colore che ha funzionato per me:

 <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

È possibile pubblicare le dipendenze (relative alla jersey) definite nel file pom? Ho lo stesso problema, ma sto già usando il plugin maven-shade-plugin. Passare a 'jersey-bundle' ha risolto il mio problema, ma vorrei evitare di definire solo le dipendenze necessarie nel mio pom. – Athafoud

+0

Questa soluzione ha funzionato per me. Ho avuto esattamente lo stesso problema. Grazie!!!! – jmsimpson68

risposta

22

Non stai unendo correttamente i barattoli di Jersey.

Jersey 1.x utilizza il meccanismo META-INF/services per scoprirne i componenti e l'assembly: singolo probabilmente copia solo tutto in un singolo jar, sovrascrivendo i file già presenti MA I file META-INF/services devono essere CONCATENATI.

Provare a utilizzare jersey-bundle (com.sun.jersey:jersey-bundle:1.14) o correggere le impostazioni di assieme (o trovare un altro plug-in per migliorarlo).

+1

Grazie, Pavel. L'hai inchiodato. Nel mio caso, il 'jersey-bundle' ha presentato problemi propri ma ho avuto successo lasciando cadere il plugin' maven-assembly-plugin' e spostandomi nel 'maven-shade-plugin'. Aggiornerò la mia domanda con estratto del POX che ha fatto il trucco. – HolySamosa

+0

Potresti postare il tuo pom? – supercobra

+0

Semplicemente aggiungendo la dipendenza del jersey-bundle e conservando l'uso del plugin maven-assembly-fix, ho risolto il problema delle dipendenze jar-with-dependencies. Per quello che vale. – Mafro34

1

Potresti postare il tuo pom?

Contrassegni alcune dipendenze come previsto? È piuttosto diverso costruire un'app standalone e una webapp, come alcuni vasi che dovrebbero essere forniti dal contenitore web (tomcat o altro).

Poiché il contenitore è "incorporato" nella tua app (e non nella tua app nel contenitore), allora forse non gestisci correttamente queste dipendenze.

Problemi correlati