嵌入式 Jetty 不提供 webapp 页面,REST 调用正常

Embedded Jetty not serving webapp pages, REST calls OK

我在 Eclipse (Mars) 中有一个带有嵌入式 jetty v9 的示例 Maven 项目。我已经为静态 html / javascript 文件定义了一个资源处理程序,为 REST API 定义了一个 servlet 处理程序。我创建了一个 fat jar(阴影包),当我 运行 来自项目 homedir 的 jar 时,它可以满足我的所有需求。它为其余 API 和网页提供服务。从任何其他目录,它只提供 REST API。对于 HTML 个页面,jetty 服务器给出了找不到的原因。

处理程序是这样武装的:

    //REST handler context
    ServletContextHandler restHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
    restHandler.setContextPath("/");

    // Jersey REST handling servlet
    ServletHolder jerseyServlet = restHandler.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*");
    jerseyServlet.setInitOrder(0);

    // Tell Jersey which REST service class to load....
    jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", RestHandler.class.getCanonicalName());

    // Handler that will handle the request for a given html page
    ResourceHandler resourceHandler = new ResourceHandler();

    // Configure page handler with login.html as the initial landing page
    resourceHandler.setDirectoriesListed(true);
    resourceHandler.setWelcomeFiles(new String[]{ "pages/login.html" });
    resourceHandler.setResourceBase("src/main/webapp/");

    //Add all handlers to the server
    Server jettyServer = new Server(8080);
    //ConstraintSecurityHandler authenticationHandler = authenticationService(jettyServer);
    //authenticationHandler.setHandler( resourceHandler );

    HandlerCollection handlerList = new HandlerCollection();
    handlerList.setHandlers(new Handler[] { resourceHandler,, 
                                            restHandler, 
                                            new DefaultHandler(), 
                                            });

    jettyServer.setHandler(handlerList);

POM.xml中的构建子句是这样的:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<build>
  <resources>
    <resource>
        <directory>${project.basedir}/src/main/webapp</directory>
    </resource>
  </resources>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>1.6</version>

      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <manifestEntries>
                  <Main-Class>com.dastratum.DasConsole.ConsoleMain</Main-Class>
                </manifestEntries>
              </transformer>
            </transformers>
            <minimizeJar>false</minimizeJar>
            <createDependencyReducedPom>true</createDependencyReducedPom>
            <filters>
            <filter>
                <artifact>*:*</artifact>
                <excludes>
                    <exclude>META-INF/*</exclude>
                    <exclude>junit:junit</exclude>
                </excludes>
            </filter>
            </filters>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

</project>

感谢任何帮助。谢谢

这个问题的基本部分(混合 ResourceHandlerServletContextHandler)之前已经回答过。

  • Embedded Jetty server, cannot see web pages under root context

但是,这里增加的问题是您正在使用 Jersey,它(历史上)将默认为静态文件本身提供服务,不允许 Servlet 容器通过 DefaultServlet 为静态文件提供服务。

建议您完全放弃 ResourceHandler,并为您的 ServletContextHandler(其中包含 Jersey)设置适当的 ResourceBase,然后确保添加 DefaultServlet映射到 /。这可能工作得很好,Jersey 提供静态内容,但如果您需要对静态文件服务进行更多控制(例如缓存控制、高效内存使用、智能 http/2 推送过滤器等),那么您'将需要采取额外的步骤将 Jersey 配置为不提供静态内容并让 Jetty 的 DefaultServlet 完成工作。