java - Spring Boot不提供静态内容(angular-cli)以在tomcat上提供应用程序
问题描述
我正在努力解决一个问题,即 spring-boot 没有在 8080 上提供前端文件(通过 angular 创建)。我ng build
将转换的 .ts ng 组件文件运行到 .js 并在 outputPath:/resource/static 文件夹中生成(我在 angular.json 文件中设置 outputPath)。创建了一个控制器来提供来自资源/静态的内容。
@Controller
public class AppController {
@GetMapping("/")
public String index() {
return "index";
}
}
主类(src/mainjava/webapp/app):
@Configuration
@EnableAutoConfiguration
@ComponentScan({"webapp"})
public class Application extends WebMvcAutoConfiguration {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.run(args);
}
}
Ranng build --base-href .
生成文件,如下图所示。
索引.html:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Welcome app</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
<script type="text/javascript" src="runtime.js"></script><script type="text/javascript" src="polyfills.js"></script><script type="text/javascript" src="styles.js"></script><script type="text/javascript" src="vendor.js"></script><script type="text/javascript" src="main.js"></script></body>
</html>
注意:这是一个 gradle 项目。前端代码位于:src/main/java/webapp/frontend dir
/resources 中的 Application.yml
server:
servlet:
context-path: /
port: 8080
在tomcat启动时:
Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-09-13 12:45:34.372 INFO 96027 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-09-13 12:45:34.384 INFO 96027 --- [ main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in exceptionHandle
2018-09-13 12:45:34.405 INFO 96027 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html]
2018-09-13 12:45:34.566 INFO 96027 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-09-13 12:45:34.568 INFO 96027 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'dataSource' has been autodetected for JMX exposure
2018-09-13 12:45:34.575 INFO 96027 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
2018-09-13 12:45:34.620 INFO 96027 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
我什至尝试在 /resources 下添加 html 文件,以查看 tomcat 是否提供此文件夹中的任何内容。我也无法访问 page1.html,因此不确定 angular/ng 内容会有何不同,以至于当 tomcat 启动并运行时它无法提供服务。
我是否需要任何其他配置才能让 spring-boot 提供角度前端代码?任何建议表示赞赏。
@DavidT 回答您的问题:
是的 build.gradle:
compile('org.springframework.boot:spring-boot-starter-web:2.0.2.RELEASE')
此处的静态内容:MYPROJECT/MYPROJECT-web/src/main/resources/static/
由于 spring-boot 没有从路径中选择角度静态内容,我参考了建议添加专门为它服务的控制器的在线资源。[我有 3 个可访问的 ng 组件 -登录:http://localhost:4200/,主页:http://localhost:4200/home,销售:http://localhost:4200/sale。但是要访问tomcat端口,我想将文件放在静态下;rest angular 将负责路由。]
从 frotnend 目录运行
ng build
时,在 frontend/src 目录下生成角度文件。我可以手动复制、手动粘贴以放入静态文件夹或更改outputPath
为指向 angular.json 中的资源/静态,直接将其放在运行 ng build cmd 上。上述资源/静态屏幕截图中的确切文件。我没有使用 javascript 控制台,但使用 IntellijIdea 的浏览器选项打开 index.html,在网页上检查我看到错误 -
拒绝从 '' 执行脚本,因为它的 MIME 类型 ('text/html') 不可执行,并且启用了严格的 MIME 类型检查。
替换会从检查中删除这些错误,但在http://localhost:8080/<script type to "text/html"
上仍然没有 UI 。
奇怪的是,当我将该演示项目中的相同 index.html 文件粘贴到我的静态文件夹中时,浏览到http://localhost:8080时它不显示任何内容。但注意到从 IntellijIdea 中的浏览器选项打开此文件时(浏览器中的此 URI:http://localhost:63342/MY-PROJ/MY-PROJ-WEB-main/static/index.html,然后显示内容
是<base href="/">
问题还是脚本标签?
解决方案
成功的步骤,而不像上面的链接那样复杂:
- 去了
https://start.spring.io/
- 选择了一个gradle项目
- 添加了网络依赖
- 下载并取消归档结果(没有从 更改名称
demo
) - 创建:demo/src/main/resources/static/index.html,内容如下:
<html><body>你在里面!</body></html>
- 在目录中发出以下
demo
命令以运行您的应用程序:./gradlew bootRun
- 打开浏览器并转到
http://localhost:8080/
您现在有证据表明将某些内容放入其中MY PROJECT/src/main/resources/static/
会生成 HTML 文件的内容。
所以我有以下问题:
您是否使用类似的方法将 SpringMVC 添加到您的 Spring Boot 项目中
compile('org.springframework.boot:spring-boot-starter-web')
?您是否将静态内容放入 MY PROJECT/src/main/resources/static/ 中?
- 如果为您提供了一个控制器,为什么您需要一个控制器来提供静态内容?尤其是映射到
/
? - 角度是否将*.html文件放入
MY PROJECT/src/main/resources/static/
? - javascript 控制台说什么?找到了吗
runtime.js
?
请参阅https://spring.io/guides/gs/serving-web-content/
添加主页部分
https://stackoverflow.com/questions/24661289/spring-boot-not-serving-static-content
有关不该做什么(以及为什么)的其他想法,请参阅内容。
这最初发布于https://www.quora.com/How-can-spring-boot-serve-angular-static-files/answer/David-Talalayevsky
推荐阅读
- javascript - 选择大小为 1gb 的文件后上传文件时出错
- linux - 调用 mkdir 到主目录会在当前工作目录中创建所述目录吗?
- drupal - 没有路径的主页
- javascript - 你如何用javascript编写一个程序,要求用户输入一个数字列表,然后找到数字的平均值
- spring - Spring Boot 在同一端口上将 HTTP 重定向到 HTTPS
- node.js - CORS “它没有 HTTP ok 状态。”
- javascript - JQuery:如何将文件推送到另一个输入数组值?
- hosting - 我应该在哪里托管个人网站?
- swift - 使用 swift 递归地列出文件夹中的所有文件
- django - Django API 中的安全性