如果将静态内容部署为 jar,则 Spring Boot 404 错误
Posted
技术标签:
【中文标题】如果将静态内容部署为 jar,则 Spring Boot 404 错误【英文标题】:Spring boot 404 error if the static content is deployed as jar 【发布时间】:2017-11-19 07:46:04 【问题描述】:我有 spring boot 应用程序和 angular js 项目作为两个不同的模块。
Angular js 内容('dist' 文件夹中的文件)被转换为 jar 文件并作为 Spring 引导应用程序的一部分包含在内。 jar 里面的文件夹结构是/static/**。
jar 出现在 spring boot 应用程序的 lib 文件夹中。
现在当我尝试访问应用程序 http://localhost:8080 时,我收到 404 错误。
如果我复制 /resources/static 中的“dist”文件夹内容并创建 spring boot jar 文件,它工作正常。
当静态内容作为 jar 文件包含时,我是否遗漏了任何内容。 ?
提前致谢
【问题讨论】:
spring boot中的静态内容应该只存在于/resources/static文件夹下,angular文件被认为是静态内容。将 dist 文件夹的内容移动到 /resources/static 文件夹中 有什么更新吗?我面临同样的问题......在 ng build 之后,使用 maven 我将所有文件放在 /BOOT-INF/classes/ 下,但仍然无法使用 URL 访问。 【参考方案1】:@Moshe Arad @Raj 在我对https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot 的理解中,
静态内容可以位于上述位置之一。但是,我自己在提供静态内容方面面临着斗争。我正在开发基于 spring-boot 和 angular-cli(6.1.5) 的应用程序。出于部署目的,以便 UI 在 spring-boot 端口上工作;我跑了ng build
。它在 src/main/resource/static 中生成文件(将 angular.json 中的 outputPath 更改为 resources/static 并在资源中创建一个空的 dir static)。但是spring-boot在8080处没有提供任何角度内容。虽然index.html有<base href="/">
,但我认为它更具体地从静态目录中选择/提供.js内容所以我跑了:
ng build --base-href / --deploy-url /static/
。这次生成的 index.html 中有 /static/runtime.js 等。但是在访问 localhost:8080/ 时(右键单击 -> 检查显示 200 响应代码)仍然没有显示任何 UI 内容。但是点击 localhost:8080/static/runtime.js 会显示 404 。
我相信除了将内容添加到资源/静态之外,还有更多工作要做,因为可能是 tomcat 试图提供它,但不知何故,内容没有被显示。因为我确实注意到浏览器选项卡上的 favicon 图标(角度图标),并且 jar 文件的内容显示路径中生成的静态文件(BOOT-INF/classes/static/index.html 等)
【讨论】:
【参考方案2】:我的设置与您类似,但使用的是 Angular 4。我的 Spring Boot 版本是 1.5.3.RELEASE。
我的构建基于带有两个模块的 Maven。一个用于前端 (JAR),一个用于后端 (WAR),它使用 Maven 依赖机制引用第一个模块。
提供开箱即用的静态内容。由于我使用的是 Spring Security,因此我必须为此资源配置访问规则。但这个问题应该用 401 而不是 404 来回答。
您的 Angular JAR 结构似乎是正确的。你的前端构建完成了吗?
带有前端 JAR 的 lib
文件夹位于路径 /WEB-INF/
上的 Spring Boot WAR 中。
您是否检查过您使用的 Spring Boot 版本是否存在错误?
【讨论】:
以上是关于如果将静态内容部署为 jar,则 Spring Boot 404 错误的主要内容,如果未能解决你的问题,请参考以下文章
spring boot项目进行war部署,对于静态资源无法访问的问题
spring boot打jar包运行,加载jar包外部的页面以及静态资源文件