当前位置:   article > 正文

[后端 springboot] 打包后html无法访问的问题_mvc:resources 加载html 打包后的包没执行

mvc:resources 加载html 打包后的包没执行
  • 目录

     

    问题描述

    解决历程

    解决方案

    结果


  • 问题描述

    最近公司需要一个展示生产过程中各项数据的简单demo,前段时间花了一晚上,按照网上的教程,搭建了了一个简单的spring boot项目,在这个过程,被maven的包更新不下来虐得shi去活来,这里记录一下关键点:
    • 用IDE自带得git拉下来的项目,一定要记得从根目录再打开一次,就是从.git的那级目录,不然就是各种报错
    • 如果maven各种下载包下载不下来,可以更换阿里云的maven库,记得最新的已经加了https就好
    • 如果换了没有作用的话,记得检查配置

右侧maven Projects 里的小工具按钮,可以快速进入maven的配置界面 

这里可以方便的更改各项配置 

  这里可以方便的打开settings.xml,把阿里云的maven镜像导入进去

  1. <mirror>
  2. <id>nexus-aliyun</id>
  3. <mirrorOf>*</mirrorOf>
  4. <name>Nexus aliyun</name>
  5. <url>https://maven.aliyun.com/repository/public</url>
  6. </mirror>
  7.  

然后因为写上位机的开发突然有空对接口了,万般无奈下,还是默默的打开了尘封已久的项目,上网随便下了一个后台管理的模板,想要放到这个项目里,简单做个后台管理页面,呵呵,然后我真的是too young too simple。周二晚上开始,中间断断续续查,周五晚上才确实访问起来。

 

  • 解决历程

    • 我的现象:把网页直接复制到resources的static路径下,无法访问静态的index.html界面。然后按各个教程不知道怎么调了调,又能访问了,然后要传数据,要用到templates目录,我全都拷贝到templates目录下,结果又不能访问了,然后又按照教程瞎调,能访问index了,结果js,css,图片全都加载不出来,于是把css,js拷贝回static目录,然后按照教程又瞎调,调到能加载了,结果打包后布到服务器上又不行,按照瞎改改后,结果本地又不行了,对自己产生了深深的怀疑,但是没关系,人不是万能的,但是程序员没有不可能。
    • 解决思路:今天整理了最近几天的解决过程,归纳了下面几条,可能不是很正确,有不对的地方也请大家多指正,首先我有的信息是下面几条:
      • spring boot 加载了thymeleaf以后会自动加载resources下templates目录的文件
        1. <dependency>
        2. <groupId>org.springframework.boot</groupId>
        3. <artifactId>spring-boot-starter-thymeleaf</artifactId>
        4. </dependency>
      • 静态资源需要放到resources下的static目录下
      • 默认jar包打包不会打包资源文件,需要在pom.xml中的build标签下添加resource标签才可以打包进去(虽然最后我用的war包)
        1. <resource>
        2. <directory>src/main/resources</directory>
        3. <targetPath>META-INF/resources</targetPath>
        4. <includes>
        5. <include>**/**</include>
        6. </includes>
        7. </resource>
      • 使用templates需要一个Controller来控制(新建一个.java的类就好)
        1. @Controller
        2. public class PageController {
        3. @RequestMapping({"", "index"})
        4. public String index(Model model) {
        5. String data = "aaaaa啊啊啊";
        6. model.addAttribute("data", data);
        7. return "/index";
        8. }
        9. }
      • controller类中return "index" 和 return "/index"就是玄学,到现在我还没明白有啥区别
      • 我修改了入口类的方法,把this.getClass()改成了Application.class (这是为了打war包弄的)
        1. protected SpringApplicationBuilder configure(
        2. SpringApplicationBuilder builder) {
        3. return builder.sources(Application.class);
        4. }
    • 里程碑:结合上面的这些知识,我给自己定了下面几个目标来方便查问题,以免没有里程碑做重复工作
      • 本地直接运行能够访问templates下的index.html页面(动态页面):完成这一步至少证明我的templates的目录配置没有问题,如果这里都访问不了,就着重上网检索关于templates目录index.html页面无法访问的信息,检索方向往配置靠。
      • 本地直接运行能够访问static下的各种js.css.image.json等资源文件:这一步主要是保证index.html能够访问的情况下,去完成静态目录下的资源访问,这里的主要测试方式是项目运行起来后,通过地址栏的路径直接访问static下的资源看是否能够访问,不能访问的话,就再调。主要检索方向往static的配置上靠。
      • 本地打包运行是否能正常访问静态页面:完成上面两步以后,基本上在本地就能看到漂亮的界面了,现在在电脑本地进行验证,通过clean ,package 打包后,打开cmd,使用 java -jar [把刚刚打好的包拖进来]来运行项目,看看是否能够正常访问,如果看到了一条can't not find templates 的运行日志,基本上就凉凉了。这里可以把包用解压软件打开,看看是否把资源打进去了。这里用静态资源测试是最好的,因为不存在controller的跳转逻辑。
      • 本地打包运行是否能正常访问动态页面:基本上静态能访问,动态也能访问的,毕竟本地都调试过了的,这里我主要是怕出现那种资源已经打进去了,但是动态会有一个controller的跳转逻辑,也就是return "/index"和return "index"的玄学问题了(虽然我觉得这个和thymeleaf.prefix的配置有关,应该加个/所有的return 就不用加/,不加/所有的return就需要加/)因为如果这里出问题肯定就比较简单,我就会直接用/来排查
      • 服务器运行本地可以的包是否能够访问静态页面:这里因为我的开发环境是windows 服务器的运行环境是centos,所以我怕因为环境的问题导致运行失败。或者包加载不出来
      • 服务器运行本地可以的包是否能够访问动态页面:理由同上,就不信经过这六步还排查弄不出来。就算穷举也应该也能搞定的。
    • 思路选择:通过网上的信息整合,我大概了解到有好多思路,但是我觉得方便操作的有下面几点,那个用controller直接返回标记语言的方法太猛了,弄不来。还有各种高级办法,深深觉得自己是条咸鱼。
      • 使用jar打包,使用java -jar 运行 (因为总是对不准路径,所以切成了war包方式,咸鱼妥协)
      • 使用war打包,使用java -jar 运行 (我最后用的这种)
      • 使用war打包,使用tomcat 里的 webapps目录解压运行 (因为我的本地项目运行时直接用的application,要用这种方式的应该本地调试的时候就用tomcat来走上面的里程碑,我懒)

 

  • 解决方案

    • controller :注意要使用@controller、RequestMapping里的""是为了不用输入index可以直接访问呢、返回的"/index"是和application.properties配置相关的
      1. @Controller
      2. public class PageController {
      3. @RequestMapping({"", "index"})
      4. public String index(Model model) {
      5. String data = "aaaaa啊啊啊";
      6. model.addAttribute("data", data);
      7. return "/index";
      8. }
      9. }
    • application.properties:主要是关闭缓存.cache和prefix配置
      1. #thymelea模板配置
      2. spring.thymeleaf.prefix=classpath:/templates
      3. spring.thymeleaf.suffix=.html
      4. spring.thymeleaf.mode=HTML
      5. spring.thymeleaf.encoding=UTF-8
      6. #热部署文件,页面不产生缓存,及时更新
      7. spring.thymeleaf.cache=false
      8. spring.resources.chain.strategy.content.enabled=true
      9. spring.resources.chain.strategy.content.paths=/**
    • static:以js为例子,这里如果要在网页里访问的话,要加上static应该可以通过配置解除的
      • 目录:resources/static/html/js/waves.js
    • templates:这里就是上面application.properties里配置的templates
      • 目录:resources/templates/index.html
    • html:
      • js调用:这里直接到了主目录再一级一级访问下来的,因为测试的时候可以在http://localhost:XXXX/static/html/js/waves.js打开这个js文件,所以就这么写了,其他的CSS和image都是一样的,以地址栏能访问的为准
        <script src="../static/html/js/waves.js"></script>
      • 调用其他页面直接调用controller类,这里修改href就可以了
        <a class="waves-effect waves-dark" href="index" aria-expanded="false">
    • ProductApplication:
        1. @Override
        2. protected SpringApplicationBuilder configure(
        3. SpringApplicationBuilder builder) {
        4. return builder.sources(Application.class);
        5. }
    • pom.xml:主要是修改了打成war包
        1. <groupId>com.example</groupId>
        2. <artifactId>springboot-demo</artifactId>
        3. <version>1.0.0</version>
        4. <packaging>war</packaging>
      • build标签的<plugins>标签下:加了个<goals>(然而我并不知道为什么)
        1. <plugin>
        2. <groupId>org.springframework.boot</groupId>
        3. <artifactId>spring-boot-maven-plugin</artifactId>
        4. <configuration>
        5. <mainClass>com.zhili.platform.zhili_product.ProductApplication</mainClass>
        6. </configuration>
        7. <executions>
        8. <execution>
        9. <goals>
        10. <goal>repackage</goal>
        11. </goals>
        12. </execution>
        13. </executions>
        14. </plugin>
      • build标签的<resources>标签下:加了个<filtering>(并不知道为什么+1)
        1. <resource>
        2. <directory>src/main/resources</directory>
        3. <filtering>true</filtering>
        4. <includes>
        5. <include>**/*</include>
        6. </includes>
        7. </resource>
      • //这个是打jar包的时候加进去的,可能我这么麻烦就是因为又是jar包又是war包弄混了(*1:后续会用到)
        1. <resource>
        2. <directory>src/main/resources</directory>
        3. <targetPath>META-INF/resources</targetPath>
        4. <includes>
        5. <include>**/**</include>
        6. </includes>
        7. </resource>
    • 运行
      • 直接使用Application运行,可以通过localhost正常访问index,静态资源均能正确显示
      • 打包使用maven projects自带的Reimport →  →  → 
      • windows下使用cmd的java -jar springboot-demo-1.0.0.war 可以通过localhost正常访问index,静态资源均能正确显示
      • centos下使用nohup java -jar springboot-demo-1.0.0.war & 可以通过http://IP 正常访问index,静态资源均能正确显示
      • 解析war包目录结构如下:可以看到WEB-INF的classes目录下直接有了templates和static目录了,(因为我们上面的配置,这里META-INF里面还有一个resources,所以我判断*1处的配置是不需要的,但是截至写这个日志的时候我还没有尝试,后面有空再尝试)

 

  • 结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/271510
推荐阅读
相关标签
  

闽ICP备14008679号