2012-03-20 33 views
8

Estoy tratando de empaquetar Grizzly con Jersey como una sola jarra utilizando el plugin de sombra Maven. Pero siempre me sale el mensaje No container provider supports the type class org.glassfish.grizzly.http.server.HttpHandlerGrizzly y jersey independiente de Jersey

El código funciona bien en Eclipse, pero no en un tarro de empaquetado:

public class Main { 

private static URI getBaseURI() { 
    return UriBuilder.fromUri("http://localhost/").port(9998).build(); 
} 

public static final URI BASE_URI = getBaseURI(); 

protected static HttpServer startServer() throws IOException { 
    System.out.println("Starting grizzly..."); 
    ResourceConfig rc = new PackagesResourceConfig("share.test"); 
    rc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); 
    return GrizzlyServerFactory.createHttpServer(BASE_URI, rc); 
} 

public static void main(String[] args) throws IOException { 
    HttpServer httpServer = startServer(); 
    System.in.read(); 
    httpServer.stop(); 
}  
} 

Aquí es la excepción completa

$ java -jar target/webServiceTest-0.0.1-SNAPSHOT.jar 
Starting grizzly... 
Mar 20, 2012 12:48:53 PM com.sun.jersey.api.core.PackagesResourceConfig init 
INFO: Scanning for root resource and provider classes in the packages: 
    share.test 
Mar 20, 2012 12:48:54 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses 
INFO: Root resource classes found: 
    class share.test.NonJAXBBeanResource 
    class share.test.Hello 
Mar 20, 2012 12:48:54 PM com.sun.jersey.api.core.ScanningResourceConfig init 
INFO: No provider classes found. 
Exception in thread "main" java.lang.IllegalArgumentException: No container provider supports the type class org.glassfish.grizzly.http.server.HttpHandler 
    at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:196) 
    at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:134) 
    at com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory.createHttpServer(GrizzlyServerFactory.java:242) 
    at share.test.Main.startServer(Main.java:27) 
    at share.test.Main.main(Main.java:31) 

Estoy construyendo el paquete jar usando maven con

<build> 
<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>1.5</version> 
    <configuration> 
    <transformers> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
    <manifestEntries> 
     <Main-Class>share.test.Main</Main-Class> 
     <Build-Number>1</Build-Number> 
    </manifestEntries> 
    </transformer> 
    </transformers> 
</configuration> 
<executions> 
<execution> 
    <phase>package</phase> 
    <goals> 
    <goal>shade</goal> 
    </goals> 
</execution> 
</executions> 
</plugin> 
</plugins> 
</build> 

¿Necesito cambiar el tapón de la cortina? para incluir algo más?

Respuesta

8

Parece que el plugin no combina los registros META-INF/services de diferentes archivos jar correctamente: si hay varios archivos con el mismo nombre en el directorio META-INF/services de varios archivos jar, deben fusionarse , no reemplazado uno por el otro. Verifique si ese es el caso.

+3

Adición de la ServicesResourceTransformer que "fusiona los recursos/servicios META-INF" hizo solucionar mi problema, gracias Martin. Solo necesitaba agregar '' al transformador en el pom.xml Reference: [link] (http://maven.apache.org /plugins/maven-shade-plugin/examples/resource-transformers.html#ServicesResourceTransformer) –

0

Acabo de cometer el error estúpido. Configurar maven-assembly-plugin en pom también.

Asamblea parece reemplazar META-INF/services y anular "com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainerProvider " en el archivo com.sun.jersey.spi.container.ContainerProvider

Como se menciona la guía http://maven.apache.org/plugins/maven-assembly-plugin/, si su proyecto desea empaquetar su artefacto en un uber-jar, el plugin de ensamblaje proporciona solo soporte básico. Para obtener más control, use el complemento Maven Shade.

<!-- mvn assembly:assembly --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <mainClass>XXX.DaemonMain</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
     </plugin> 
1

enlacen me ayudaron a averiguar la solución a continuación:

especialmente la respuesta

En lugar de utilizar las dependencias JAR-con-como el descriptorRef de su configuración de montaje-plugin crear nuestro propio ejemplo, en src/assembly/depmerge.xml (ver a continuación). Esta configuración de ensamblaje agregará un contenedorDescriptorHandler que se preocupa por los servicios META-INF /.

plazo

mvn clean compile assembly:single 

para obtener un archivo jar en el objetivo que se puede llamar con

java -jar target/x.y.-version-jar-with-dependencies.jar 

pom.xml:

 <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.5.3</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>${mainClass}</mainClass> 
        </manifest> 
       </archive> 
      <descriptor>src/assembly/depmerge.xml</descriptor> 
      </configuration> 
     </plugin> 

src/montaje/depmerge.xml:

<!-- 
see http://maven.apache.org/guides/mini/guide-assemblies.html 
see http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html 
--> 
<assembly 
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 
    <!-- TODO: a jarjar format would be better --> 
    <id>jar-with-dependencies-and-services</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
     <dependencySet> 
      <outputDirectory>/</outputDirectory> 
      <useProjectArtifact>true</useProjectArtifact> 
      <unpack>true</unpack> 
      <scope>runtime</scope> 
     </dependencySet> 
    </dependencySets> 
    <!-- 
     https://stackoverflow.com/questions/1607220/how-can-i-merge-resource-files-in-a-maven-assembly 
    --> 
    <containerDescriptorHandlers> 
     <containerDescriptorHandler> 
      <handlerName>metaInf-services</handlerName> 
     </containerDescriptorHandler> 
    </containerDescriptorHandlers> 
</assembly>