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:
- http://maven.apache.org/guides/mini/guide-assemblies.html
- http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html
- ¿Cómo puedo fusionar archivos de recursos en un ensamblaje de Maven?
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>