一、gradle经验
1、在.gitignore文件中,/dist/表示根目录的dist文件,dist/表示各子工程的dist文件;
2、gradle拷贝文件时,可以用exclude排除掉其中的任意文件;
3、用gradle执行installDist时遇到了“*/bin does not exist.”这样的报错,在Windows平台下不会出现这个问题,在Linux平台下才会出现这样的报错,猜想应该是Linux平台下gradle在执行installDist后默认会校验bin目录下的文件,若不存在就会报错,具体原因可能需要阅读下gradle的源码,以后有空再研究吧。
二、若是报了空指针异常,这个问题其实很好解决,肯定是调用方为null,要么是没注入,要么是空值。
三、出现了奇怪的问题,此时要从代码入手
1、从反编译、IDE下载、GitHub上拷贝的方式来获得代码;
2、根据错误日志中的关键字搜索代码,譬如分析代码中解析.properties文件的逻辑;
3、IDEA远程连接测试环境断点调试。
四、css、js静态资源获取不到时的调试方法
1、降低spring boot的日志级别logging.level.org.springframework=DEBUG;
2、单个css、js静态资源的请求调试,每个静态资源的请求都会打印在DEBUG级别日志中。
五、Spring Boot启动时资源路径的加载过程
1、java.exe将带有conf和abc.jar的classpath参数传递给带有@SpringBootApplication注解的启动类;
2、通过Servlet工厂类AbstractEmbeddedServletContainerFactory的getUrlsOfJarsWithMetaInfResources方法从classpath中筛选出满足条件的资源路径放入静态资源url的列表中;
3、将静态资源url的列表传递给内嵌的应用容器Tomcat;
4、应用容器通过Tomcat类中的start方法启动,在运行到TomcatEmbeddedServletContainer中的findContext方法时,通过断点调试可以看到Context中的jarResources中包括了外层到/META-INF/resources的路径;
5、在请求视图时,spring boot会将Context中包含/META-INF/resources的资源路径,拼接上视图解析器ViewResolver中配置的前后缀来找到对应的视图资源。
六、在一个简化的spring mvc中,127.0.0.1:8080/abc/是如何请求到对应的视图?
1、127.0.0.1是服务器的端口,8080是配在application.properties中的server.port=8081,abc是配在application.properties中的server.context-path=/abc/。
2、spring接收到请求后,程序可能会进行一个请求转发,将127.0.0.1:8080/abc/转发为127.0.0.1:8080/abc/login.do;
3、127.0.0.1:8080/abc/login.do可能会配置一个@RequestMapping来返回login视图;
4、视图解析器ViewResolver会依据配置好的prefix和suffix来增加前后缀,譬如WEB-INF/jsps/login.jsp;
5、spring会去寻找视图资源,在前面加上Context中已经载入的静态资源url,于是就成了conf或abc.jar/META-INF/resources/WEB-INF/jsps/login.jsp;
6、于是最终的请求链接其实可以理解为127.0.0.1:8080/abc/conf或abc.jar/META-INF/resources/WEB-INF/jsps/login.jsp。
七、spring boot中1.5.2.RELEASE和1.5.4.RELEASE这两个版本的Servlet工厂类AbstractEmbeddedServletContainerFactory的getUrlsOfJarsWithMetaInfResources方法在加载staticResourceUrls静态资源时略有差异。
1.5.2.RELEASE
1.5.4.RELEASE
多看几遍后可以看出差异,简单理解就是1.5.2.RELEASE版本中只判断是否为资源jar包的isResourcesJar,如果是就放入静态资源路径中staticResourceUrls.add(url),但1.5.4.RELEASE进行了升级,先判断是否为资源路径的isResourcesDir,再判断是否为资源jar包的isResourcesJar,只要任何一个满足就放入静态资源路径中staticResourceUrls.add(url)。
这个差异对我们编程的改变是什么?聪明的你一定想到了,在1.5.2.RELEASE版本中,视图文件只能放在jar包中META-INF/resources的路径内,但在1.5.4.RELEASE版本中也可以放到classpath下任意一个文件夹的META-INF/resources路径内,我们可以猜想一下spring boot版本升级后这样完善的原因,可能是视图资源放在jar包不方便查看,于是也可以让你们放到外部任何加入到classpath下的文件夹中。
PS:这里的staticResourceUrls静态资源指的是视图资源,至于配置在application.properties中用于存放css、js等静态资源的spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/目前没有出现在Context中,譬如将css、js放入static中,还需要下一步的研究。
这次在坑里掉了很久,主要是因为对开源框架内部的运行机理不清楚,没有认真去读spring boot的代码,这也是使用开源框架的问题所在,你按照他的套路来,那么会非常省心省力,但若想基于开源框架进行个性化的服务改造,就会遇到各种各样的问题,主要是因为不懂内部运行机理,代码读得太少。
所以,我们还是要抽空多看开源代码,多琢磨代码背后的运行机理,用最近看到的一位大神的话来总结——编程不过是一门失传的艺术的别名,这门艺术的名字叫“思考”。