嵌入式 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>
感谢任何帮助。谢谢
这个问题的基本部分(混合 ResourceHandler
和 ServletContextHandler
)之前已经回答过。
- Embedded Jetty server, cannot see web pages under root context
但是,这里增加的问题是您正在使用 Jersey,它(历史上)将默认为静态文件本身提供服务,不允许 Servlet 容器通过 DefaultServlet 为静态文件提供服务。
建议您完全放弃 ResourceHandler
,并为您的 ServletContextHandler
(其中包含 Jersey)设置适当的 ResourceBase,然后确保添加 DefaultServlet
映射到 /
。这可能工作得很好,Jersey 提供静态内容,但如果您需要对静态文件服务进行更多控制(例如缓存控制、高效内存使用、智能 http/2 推送过滤器等),那么您'将需要采取额外的步骤将 Jersey 配置为不提供静态内容并让 Jetty 的 DefaultServlet
完成工作。
我在 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>
感谢任何帮助。谢谢
这个问题的基本部分(混合 ResourceHandler
和 ServletContextHandler
)之前已经回答过。
- Embedded Jetty server, cannot see web pages under root context
但是,这里增加的问题是您正在使用 Jersey,它(历史上)将默认为静态文件本身提供服务,不允许 Servlet 容器通过 DefaultServlet 为静态文件提供服务。
建议您完全放弃 ResourceHandler
,并为您的 ServletContextHandler
(其中包含 Jersey)设置适当的 ResourceBase,然后确保添加 DefaultServlet
映射到 /
。这可能工作得很好,Jersey 提供静态内容,但如果您需要对静态文件服务进行更多控制(例如缓存控制、高效内存使用、智能 http/2 推送过滤器等),那么您'将需要采取额外的步骤将 Jersey 配置为不提供静态内容并让 Jetty 的 DefaultServlet
完成工作。