java - Grizzly 和 Jersey 独立 jar

标签 java maven jersey grizzly

我正在尝试使用 Maven 阴影插件将 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 包

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

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

最佳答案

错误看起来是插件没有正确合并来自不同 jar 的 META-INF/services 记录 - 如果几个 jar 的 META-INF/services 目录中有多个同名文件,则需要合并它们,没有一个被另一个取代。检查是否是这种情况。

关于java - Grizzly 和 Jersey 独立 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9787265/

相关文章:

java - 如何通过省略中介类来简化Retrofit

java - 如果我尝试读取的文件与我正在使用的 java 文件位于同一包中,为什么我仍然得到 "FileNotFoundException"?

java - 一个类如何扩展两个不同的类,其中一个类来自外部库,另一个类是内置的

java - CollectionUtils 使用对象元素集合过滤对象集合

java - 通过 Maven 使用 Informix 数据库

java - 从 Java 8 迁移到 Java 11 后出现 InaccessibleObjectException

spring - Maven错误 "annotations are not supported....."

java - 使用 Jersey Client 在 POST 中发送名称值对

java - 为什么我的标题在 POST 后为空?

java - 将多部分功能添加到 Tomcat 中的 Jersey Web 服务