jetty + Jersey 在 intelliJ 中的工作在 Jar 中失败

jetty + Jersey works in intelliJ fails in Jar

我是 java 的新手,所以我不确定为什么会这样。

我使用 Jersey + Jetty 开发了一个小型 java 应用程序。当 运行 它在 intelliJ 中但在 jar 中不起作用时,这非常有效。 当我去 localhost:2222 码头时,应该会显示一个 index.html 页面 但是码头却说此服务器上没有上下文匹配或处理此请求。

Jar 是使用这些说明创建的 How to build jars from IntelliJ properly?

    public class App{
    private static final int SERVER_PORT = 2222;

    public static void main(String[] args) throws Exception {
        URI baseUri = UriBuilder.fromUri("http://localhost").port(SERVER_PORT)
        .build();
        ResourceConfig config = new ResourceConfig(Resource.class);
        Server server = JettyHttpContainerFactory.createServer(baseUri, config,
        false);

        ContextHandler contextHandler = new ContextHandler("/rest");
        contextHandler.setHandler(server.getHandler());

        ResourceHandler resourceHandler = new ResourceHandler();
        resourceHandler.setWelcomeFiles(new String[] { "index.html" });
        resourceHandler.setResourceBase("src/Web");

        HandlerCollection handlerCollection = new HandlerCollection();
        handlerCollection.setHandlers(new Handler[] { resourceHandler,
        contextHandler, new DefaultHandler() });
        server.setHandler(handlerCollection);
        server.start();
        server.join();
        }
}

您在该嵌入式码头代码中指定的上下文路径是 /rest

您看到的消息甚至告诉您。

如果你想让它在 root 上,那么你的代码应该是 new ContextHandler("/"); 而不是

需要做一些事情才能使它正常工作。 首先 src/web 目录未包含在 .jar 中。

问题解决后问题仍然存在,因为代码无法在 .jar 中找到 index.html 页面的位置。

将我的代码更改为以下代码修复了它。

String webDir = this.getClass().getClassLoader().getResource("src/Web").toExternalForm(); 

ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setWelcomeFiles(new String[]{"index.html"});
resourceHandler.setResourceBase(webDir);