当前位置: 首页 > 知识库问答 >
问题:

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

公良光熙
2023-03-14

我在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:07PM com.sun.jersey.api.core.PackagesResourceConfig init信息:在包中扫描根资源和提供程序类:Application 2016年12月30日4:00:08PM com.sun.jersey.api.core.ScanningResourceConfig logClasses信息:找到根资源类:class Application.GreetingClass Application.Example 2016年12月30日4:00:08PM com.sun.jersey.api.core.ScanningResourceConfig init信息:找不到提供程序类。2016年12月30日4:00:08 PM com.sun.Jersey.server.impl.application.webapplicationimpl_initiate信息:正在启动Jersey应用程序,版本“Jersey:1.19.3 10/24/2016 03:43 PM”2016年12月30日4:00:08 PM org.glassfish.grizzly.http.server.networklistener启动信息:已启动的侦听器绑定到[0.0.0.0:8000]2016年12月30日4:00:08 PM org.glassfish.grizzly.http.server.HttpServer启动信息:[HttpServer]在:2016-12-30T16:00:13.097在:2016-12-30T16:00:13.097在:2016-12-30T16:00:14.319在:2016-12-30T16:00:14.319在:2016-12-30T16:00:14.319接收请求。30T16:00:15.583已与目标VM断开连接,地址:“127.0.0.1:61163”,传输:“套接字”

但是,当我创建一个包含所有依赖项的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.httpserver.handleread(httpserverfilter.java:168)在org.glassfish.grizzly.FilterChain.executorresolver.119)在org.glassfish.grizly.FilterChain.defaultfilterchain.execute(UltFilterChain.java:265)在org.glassfish.grizzly.FilterChain.defaultFilterChain.executeChainPart(defaultFilterChain.java:200)在org.glassfish.grizzly.FilterChain.defaultFilterChain.execute(defaultFilterChain.java:134)在transport.fireioevent(tcpniotransport.java:815)位于org.glassfish.grizzly.sTrateGies.AbstractionStrategy.FireioEvent(AbstractionStrategy.java:112)在org.glassFish.grizzly.Strategies.WorkerThreadIoStrategy.run0(WorkerThreadIoStrategy.run0:115)在org.glassFish.grizzly.Strategies.WorkerThreadIoStrategy.Access$100(WorkerThreadIoStrategy.java:55)在zzly.threadpool.abstractthreadpool$worker.run(abstractthreadpool.java:547)位于java.lang.thread.run(未知源)

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

共有1个答案

唐永春
2023-03-14

异常似乎已从IllegalStateException变为IllegalArgumentException。

看一看用于ContainerProvider的Java文档。 ContainerProvider是一个SPI类,它的实现将由您使用的服务器提供,在您的例子中是Grizzly服务器。根据Java doc:
一个实现(服务提供者)通过在资源目录meta-inf/services中放置一个提供者配置文件(如果还不存在的话)“com.sun.jersey.spi.container.containerProvider”来标识自己,并在该文件中包含实现的完全限定的服务提供者类。

因此,我认为您需要将“meta-inf/services”更新到您的jar,并将提供者添加为“GrizzlyContainerProvider”(包限定)。

你可以看看类似的帖子:Grizzly and Jersey standalone jar

 类似资料:
  • 我使用kotlin中的EclipsePAHOMQTT库和IntellijIDE中的Gradle创建了一个小型mqtt应用程序。当通过Intellij运行它时,它运行良好,但是当我构建它并运行创建的jar文件时,我会得到一个错误。 从我看到的其他问题来看,这似乎与类路径有关,但我不确定如果这确实是问题所在,需要做什么,因为我使用的是gradle而不是jar文件作为库。 我正在学习这个教程 这是我的档

  • 我可以运行在JAR中找到的SH文件吗? 我正在尝试从参考资料中提取文件并将其插入进程中。 当我尝试以这种方式运行时,我给了我一个错误 或者只是如果外部文件然后我可以执行它?

  • 问题内容: 如果您在 / myfolder中 有一个名为jar的文件,并且您想使用从中调用的类,那么如何从命令行进行操作呢? 我以为会进入目录然后说,但这不起作用。任何帮助,将不胜感激。 问题答案: 使用。 如果该类不在包中,则只需。 如果您不在所在目录中,则可以执行以下操作: 在Unix或Linux平台上:

  • 因此,我基本上希望通过多个jar文件来调试所有不同的微服务,它们向彼此的API发送/接收消息。我现在所做的是从命令行运行每个jar文件,分别为java-jar-xdebug-xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005***.jar,并使用相同端口的intellij进行远程调试。 我想知道是否可以将所有的jar文件放在一个

  • 有人能告诉我如何用Intellij和Gradle在cmd中运行.jar文件吗? 我尝试创建清单文件,但出现错误: 或 我的主要类:

  • 我需要使用存储在jar文件中的build.xml文件运行ANT构建。这个jar文件在类路径上可用。有没有可能做到这一点,而不爆炸的jar文件,并保存build.xml到本地目录?如果是这样,我该怎么做。 更新: jar文件是一个ant构建项目,其中类路径中的build.xml是通过使用ant库的java程序运行的。前端是一个web应用程序,它作为依赖项加载这个构建项目jar。用户将单击构建应用程序