在IntelliJ中运行和从JAR文件运行之间的区别

时间:2016-12-30 14:45:41

标签: java jersey grizzly

我在Grizzly服务器上为Jersey应用程序运行以下简单示例:

@Path("example")
public class example {
    @POST
    public Response someMethod(@Context Request r) {
        System.out.println("Received request at : " + LocalDateTime.now());
        Response response = Response.ok().build();
        return response;
    }
}


public class GrizzlyServerMain {

    public static HttpServer startServer(String BASE_URI) throws IOException {

        // Scans for JAX-RS resources and providers in the specified code-package
        final ResourceConfig resourceConfig = new PackagesResourceConfig("Application");

        // create and start a new instance of grizzly http server exposing the Jersey application at BASE_URI
        return GrizzlyServerFactory.createHttpServer(BASE_URI, resourceConfig);
    }

    public static void main(String[] args) throws IOException {
        String BASE_URI = "http://0.0.0.0:8000";

        // Base URI the Grizzly HTTP server will listen on
        startServer(BASE_URI);

        //noinspection ResultOfMethodCallIgnored
        System.in.read();
    }
}

当我从IntelliJ运行它时,一切都按预期工作。

  

连接到目标VM,地址:'127.0.0.1:61163',传输:   'socket'2016年12月30日下午4:00:07   com.sun.jersey.api.core.PackagesResourceConfig init INFO:正在扫描   包中的根资源和提供者类:Application Dec   30,2016 4:00:08 PM com.sun.jersey.api.core.ScanningResourceConfig   logClasses INFO:找到的根资源类:class   Application.Greetings类Application.example 2016年12月30日4:00:08   PM com.sun.jersey.api.core.ScanningResourceConfig init INFO:不   找到提供程序类。 2016年12月30日下午4:00:08   com.sun.jersey.server.impl.application.WebApplicationImpl _initiate   信息:启动Jersey应用程序,版本'Jersey:1.19.3   2016年10月24日下午03:43,2016年12月30日下午4:00:08   org.glassfish.grizzly.http.server.NetworkListener启动信息:已启动   听众绑定到[0.0.0.0:8000] 2016年12月30日下午4:00:08   org.glassfish.grizzly.http.server.HttpServer启动INFO:[HttpServer]   入门   收到请求:2016-12-30T16:00:13.097   收到请求时间:2016-12-30T16:00:14.319   收到请求:2016-12-30T16:00:15.583   断开与目标VM的连接,地址:   '127.0.0.1:61163',transport:'socket'

但是当我创建一个包含所有依赖项的JAR时,只要我从客户端发送请求,我就会得到:

  

警告:FilterChain执行期间出现异常   java.lang.IllegalStateException           在org.glassfish.grizzly.http.server.io.OutputBuffer.reset(OutputBuffer.java:217)           在org.glassfish.grizzly.http.server.Response.reset(Response.java:732)           在org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:168)           在org.glassfish.grizzly.filterchain.ExecutorResolver $ 9.execute(ExecutorResolver.java:119)           在org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:265)           在org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)           在org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:134)           在org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)           在org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:78)           在org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:815)           在org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)           在org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)           在org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access $ 100(WorkerThreadIOStrategy.java:55)           在org.glassfish.grizzly.strategies.WorkerThreadIOStrategy $ WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)           在org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:567)           在org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:547)           在java.lang.Thread.run(未知来源)

你能告诉我我能做错什么吗?

1 个答案:

答案 0 :(得分:1)

异常似乎已从IllegalStateException更改为IllegalArgumentException。

查看ContainerProvider的Java Doc。 ContainerProvider是一个SPI类,它的实现将由您使用的服务器提供,在您的情况下是Grizzly服务器。 根据Java Doc:
实现(服务提供者)通过在资源中放置提供者配置文件(如果尚未存在),“com.sun.jersey.spi.container.ContainerProvider”来标识自己目录META-INF / services,包括文件中实现的完全限定的service-provider-class。

所以,我认为您需要将“META-INF / services”更新到您的jar并将提供者添加为“GrizzlyContainerProvider”(包合格)。

您可以看一下类似的帖子: Grizzly and Jersey standalone jar