Grizzly和Jersey独立jar子

我正在尝试使用Maven shade插件将Grizzly与Jersey打包成一个单独的jar。 但我总是得到消息No container provider supports the type class org.glassfish.grizzly.http.server.HttpHandler

代码在Eclipse中运行良好,但不在打包的jar中:

 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(); } } 

这是完整的例外

 $ 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) 

我正在使用maven构建jar包

    org.apache.maven.plugins maven-shade-plugin 1.5     share.test.Main 1       package  shade       

我是否需要更改阴影插件以包含其他内容?

错误看起来插件没有正确合并来自不同jar子的META-INF /服务记录 – 如果在几个jar子的META-INF / services目录中有多个具有相同名称的文件,则需要合并,而不是替换一个由另一个。 检查是否是这种情况。

以下链接帮助我找出以下解决方案:

特别是答案

而不是使用jar-with-dependencies作为程序集 – 插件配置的descriptorRef,您可以在src / assembly / depmerge.xml中创建我们自己的(见下文)。 此程序集配置将添加一个关注META-INF / services的containerDescriptorHandler。

 mvn clean compile assembly:single 

获取目标中的jar文件,您可以调用它

 java -jar target/xy-version-jar-with-dependencies.jar 

pom.xml中:

   maven-assembly-plugin 2.5.3    ${mainClass}   src/assembly/depmerge.xml   

SRC /组件/ depmerge.xml:

    jar-with-dependencies-and-services  jar  false   / true true runtime      metaInf-services    

我犯了一个愚蠢的错误。 也在pom中配置maven-assembly-plugin。

程序集似乎取代了META-INF / services并覆盖了文件com.sun.jersey.spi.container.ContainerProvider中的 “com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainerProvider”

作为指南http://maven.apache.org/plugins/maven-assembly-plugin/提到,如果您的项目想要将工件打包在超级jar中,则程序集插件仅提供基本支持。 要获得更多控制,请使用Maven Shade插件。

    org.apache.maven.plugins maven-assembly-plugin    true XXX.DaemonMain    jar-with-dependencies