新项目采用spring boot来搭建,因为之前也没有仔细研究过,只是直接拿过来用,所以一路上会遇到不少的问题,总结一下。
spring boot最大的特点应该是给我们提供了很多的起步依赖和自动配置,这些功能,用的好了能省不少事,但不了解的时候直接用也会出很多的错误。
1、在刚搭建完spring boot项目之后,通过主类启动spring boot项目,启动之后会自动停止,这是因为该项目不是web项目,此时需要在项目中添加一下两个依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId></dependency>
然后项目就可以一直启动,不会自动关闭。
2、在spring boot中,有很多AutoConfiguration,有时候spring boot找不到需要的属性时就会报错,这个时候就需要在@EnableAutoConfiguration(exclude={})中将对应
的class排掉,比如你自己配连接池,就需要自己排除掉DataSourceAutoConfiguration。
3、spring boot在本地一直都是直接启动,如果要部署到容器中,就可能会出现问题。由于公司用的容器都是resin,在resin中部署的时候,就遇到如下报错:
noMethodDefError:javax.persistence.Table:indexes()方法
注:resin版本:resin-pro-4.0.54 hibernate core:5.0.3。刚遇见这个问题时也是一头雾水,后来查出来了,是因为resin在加载web项目时也会自带一些jar包,存放于
resin主目录下lib文件夹中,该版本resin中的javaee-16.jar中带有jpa 2.0版本,但hibernate5.1实现的是jpa 2.1版本,这个才是真正冲突的原因。由于此前一直没有遇到过
类似问题,所以这次也算是长见识了。包冲突不只是项目中引入的包冲突,还可能和容器中的包中冲突。最后的解决方案,在网上查到有三种:
1、修改resin的类加载器配置,简单讲,就是在WEB-INF目录下加入resin-web文件,内容如下:
<web-app>
<class-loader>
<servlet-hack/>
</class-loader>
</web-app>
此种方法我做了尝试,但遇到解析xml的错误,大概是resin要是用自己的xml解析器,遂没有在往下运行。
2、降低hibernate的版本,降到支持jpa2.0的版本,但是如果使用了spring起步依赖的话,会是很麻烦的问题,包括spring boot在内的所有版本都要降低。
3、直接部署jar 包。这当然是最直观的方式,至于为什么一开始没有用这种方法部署,是因为部门以往的项目都是用resin部署,而且resin的watch dog机制可以防止进程挂掉,
无需额外的监控