tutorial servlet restful jax example java maven jersey grizzly

java - servlet - Grizzly y Jersey jar individual



jersey web service tutorial (3)

El error parece que el complemento 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 reemplazarse. por el otro Verifique si ese es el caso.

Estoy tratando de empaquetar a Grizzly con Jersey como una sola jarra utilizando el plugin de colores Maven. Pero siempre obtengo el mensaje No container provider supports the type class org.glassfish.grizzly.http.server.HttpHandler

El código funciona bien en Eclipse, pero no en un paquete 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í está 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>

¿Debo cambiar el plugin de sombreado para incluir algo más?


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

El ensamblado parece reemplazar los servicios META-INF / y reemplaza "com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainerProvider" en File com.sun.jersey.spi.container.ContainerProvider

Como se mencionó en 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>


Los siguientes enlaces me ayudaron a encontrar la solución a continuación:

especialmente la respuesta

  • https://.com/a/11331222/1497139

En lugar de usar las dependencias jar-with-como el descriptorRef de su configuración de plugin de ensamblaje, usted crea el nuestro, por 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 /.

correr

mvn clean compile assembly:single

para obtener un archivo jar en destino al que puedes llamar

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 / assembly / 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://.com/questions/1607220/how-can-i-merge-resource-files-in-a-maven-assembly --> <containerDescriptorHandlers> <containerDescriptorHandler> <handlerName>metaInf-services</handlerName> </containerDescriptorHandler> </containerDescriptorHandlers> </assembly>