• 目录
     
    问题描述解决历程解决方案结果

问题描述

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

springboot 新添加的js无法访问 springboot无法访问html_java

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

springboot 新添加的js无法访问 springboot无法访问html_spring boot_02

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

springboot 新添加的js无法访问 springboot无法访问html_spring boot_03

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

<mirror>
  <id>nexus-aliyun</id>
  <mirrorOf>*</mirrorOf>
  <name>Nexus aliyun</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

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

 

解决历程

  • 我的现象:把网页直接复制到resources的static路径下,无法访问静态的index.html界面。然后按各个教程不知道怎么调了调,又能访问了,然后要传数据,要用到templates目录,我全都拷贝到templates目录下,结果又不能访问了,然后又按照教程瞎调,能访问index了,结果js,css,图片全都加载不出来,于是把css,js拷贝回static目录,然后按照教程又瞎调,调到能加载了,结果打包后布到服务器上又不行,按照瞎改改后,结果本地又不行了,对自己产生了深深的怀疑,但是没关系,人不是万能的,但是程序员没有不可能。
  • 解决思路:今天整理了最近几天的解决过程,归纳了下面几条,可能不是很正确,有不对的地方也请大家多指正,首先我有的信息是下面几条:
  • spring boot 加载了thymeleaf以后会自动加载resources下templates目录的文件
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  • 静态资源需要放到resources下的static目录下
  • 默认jar包打包不会打包资源文件,需要在pom.xml中的build标签下添加resource标签才可以打包进去(虽然最后我用的war包)
<resource>
   <directory>src/main/resources</directory>
   <targetPath>META-INF/resources</targetPath>
   <includes>
      <include>**/**</include>
   </includes>
</resource>
  • 使用templates需要一个Controller来控制(新建一个.java的类就好)
@Controller
public class PageController {
    @RequestMapping({"", "index"})
    public String index(Model model) {
        String data = "aaaaa啊啊啊";
        model.addAttribute("data", data);
        return "/index";
    }
}
  • controller类中return "index" 和 return "/index"就是玄学,到现在我还没明白有啥区别
  • 我修改了入口类的方法,把this.getClass()改成了Application.class (这是为了打war包弄的)
protected SpringApplicationBuilder configure(
      SpringApplicationBuilder builder) {
   return builder.sources(Application.class);
}
  • 里程碑:结合上面的这些知识,我给自己定了下面几个目标来方便查问题,以免没有里程碑做重复工作
  • 本地直接运行能够访问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配置相关的
@Controller
public class PageController {
    @RequestMapping({"", "index"})
    public String index(Model model) {
        String data = "aaaaa啊啊啊";
        model.addAttribute("data", data);
        return "/index";
    }
}
  • application.properties:主要是关闭缓存.cache和prefix配置
#thymelea模板配置
spring.thymeleaf.prefix=classpath:/templates
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
#热部署文件,页面不产生缓存,及时更新
spring.thymeleaf.cache=false
spring.resources.chain.strategy.content.enabled=true
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:
@Override
protected SpringApplicationBuilder configure(
      SpringApplicationBuilder builder) {
   return builder.sources(Application.class);
}
  • pom.xml:主要是修改了打成war包
<groupId>com.example</groupId>
<artifactId>springboot-demo</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
  • build标签的<plugins>标签下:加了个<goals>(然而我并不知道为什么)
<plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
   <configuration>
      <mainClass>com.zhili.platform.zhili_product.ProductApplication</mainClass>
   </configuration>
   <executions>
      <execution>
         <goals>
            <goal>repackage</goal>
         </goals>
      </execution>
   </executions>
</plugin>
  • build标签的<resources>标签下:加了个<filtering>(并不知道为什么+1)
<resource>
   <directory>src/main/resources</directory>
   <filtering>true</filtering>
   <includes>
      <include>**/*</include>
   </includes>
</resource>
  • //这个是打jar包的时候加进去的,可能我这么麻烦就是因为又是jar包又是war包弄混了(*1:后续会用到)
<resource>
   <directory>src/main/resources</directory>
   <targetPath>META-INF/resources</targetPath>
   <includes>
      <include>**/**</include>
   </includes>
</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处的配置是不需要的,但是截至写这个日志的时候我还没有尝试,后面有空再尝试)

 

结果

springboot 新添加的js无法访问 springboot无法访问html_spring_04