我可以使用 spring-boot-starter-tomcat 但不使用 spring-boot-starter-web 来提供静态内容吗?
Can I serve static content with spring-boot-starter-tomcat but without spring-boot-starter-web?
我正在使用 spring-boot-starter-jersey
和 spring-boot-starter-tomcat
(v. 1.5.2)开发 Web 服务,因此,我不想添加 spring-boot-starter-web
并进一步复杂化我的配置。我想将 Swagger UI 静态文件放在一个文件夹中并从那里提供它们。
我想知道的是,我可以仅使用 spring-boot-starter-tomcat
提供静态文件吗?我发现 Spring documentation saying that I can server static content from a variety of sources on the classpath,但我发现的示例似乎需要 Spring MVC。我试过禁用 Jersey 并将静态文件放入 src/main/resources/static
以仅测试 Tomcat,但是当我转到 localhost/index.html 时,我收到 404 not found 错误。
你可能会从我的路径中看出,我正在使用 Maven。
既然你可以只用 Tomcat 提供静态文件,看来我应该可以用 spring-boot-starter-tomcat
提供静态文件。如果是这种情况,我应该把这些文件放在哪里?
换句话说,假设我已经开始使用 Spring-provided
spring-boot-sample-jersey 项目。我要求 Jersey Web 服务应答对根地址 (/) 的调用。我将如何添加一些静态内容(HTML、CSS、JS)以从名为 /swagger 的子目录提供服务?
所以默认的 servlet(提供静态内容)是默认注册的。但它只会使用搜索特定路径作为文档根目录。我不得不深入研究源代码 finally find it。如果您查看 AbstractEmbeddedServletContainerFactory
,您会看到
private static final String[] COMMON_DOC_ROOTS = {
"src/main/webapp", "public", "static" };
如果我们不显式设置文档根目录,以上三个是将被搜索的路径。按照顺序,找到的第一个目录将用作文档根目录。我已经验证了所有这些工作。
如果要设置不同的目录,可以使用自定义程序 bean
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setDocumentRoot(new File("src/main/resources/static"));
}
};
}
我还没有弄清楚的一件事是我们是否可以将文件作为类路径资源而不是文件系统资源提供。如果您查看我链接到的源代码,它有一些代码会查找 META-INF/resources
的存在。我认为这可能有用,但不幸的是它不适合我。也许 Spring Boot 团队的一些人可以启发我们。
我正在使用 spring-boot-starter-jersey
和 spring-boot-starter-tomcat
(v. 1.5.2)开发 Web 服务,因此,我不想添加 spring-boot-starter-web
并进一步复杂化我的配置。我想将 Swagger UI 静态文件放在一个文件夹中并从那里提供它们。
我想知道的是,我可以仅使用 spring-boot-starter-tomcat
提供静态文件吗?我发现 Spring documentation saying that I can server static content from a variety of sources on the classpath,但我发现的示例似乎需要 Spring MVC。我试过禁用 Jersey 并将静态文件放入 src/main/resources/static
以仅测试 Tomcat,但是当我转到 localhost/index.html 时,我收到 404 not found 错误。
你可能会从我的路径中看出,我正在使用 Maven。
既然你可以只用 Tomcat 提供静态文件,看来我应该可以用 spring-boot-starter-tomcat
提供静态文件。如果是这种情况,我应该把这些文件放在哪里?
换句话说,假设我已经开始使用 Spring-provided spring-boot-sample-jersey 项目。我要求 Jersey Web 服务应答对根地址 (/) 的调用。我将如何添加一些静态内容(HTML、CSS、JS)以从名为 /swagger 的子目录提供服务?
所以默认的 servlet(提供静态内容)是默认注册的。但它只会使用搜索特定路径作为文档根目录。我不得不深入研究源代码 finally find it。如果您查看 AbstractEmbeddedServletContainerFactory
,您会看到
private static final String[] COMMON_DOC_ROOTS = {
"src/main/webapp", "public", "static" };
如果我们不显式设置文档根目录,以上三个是将被搜索的路径。按照顺序,找到的第一个目录将用作文档根目录。我已经验证了所有这些工作。
如果要设置不同的目录,可以使用自定义程序 bean
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setDocumentRoot(new File("src/main/resources/static"));
}
};
}
我还没有弄清楚的一件事是我们是否可以将文件作为类路径资源而不是文件系统资源提供。如果您查看我链接到的源代码,它有一些代码会查找 META-INF/resources
的存在。我认为这可能有用,但不幸的是它不适合我。也许 Spring Boot 团队的一些人可以启发我们。