spring boot 遇坑

 

spring-boot-maven-plugin打包出来的jar是不可依赖的

比如有一个root工程,type为pom,下面两个spring-boot工程中作为它的module,分别为moduleA和moduleB。假如moduleA依赖于moduleB。如果你在moduleB中使用了spring-boot-maven-plugin的默认配置build,或者在root中使用spring-boot-maven-plugin的默认配置build。很遗憾,你在clean package的时候会发现module找不到moduleB中的类。原因就是默认打包出来的jar是不可依赖的。

解决方案:

1.调整你的代码,把spring-boot的东西从moduleB中移走。官方文档是这样说的,但是大部分人不会这么干。

2.官方告诉我们,如果不想移动代码,好吧,我这样来给你解决,给你打两个jar,一个用来直接执行,一个用来依赖。于是,你需要指定一个属性classifier,这个属性为可执行jar包的名字后缀。比如我设置<classifier>exec</classifier>,原项目名为Vehicle-business。

那么我会得到两个jar:Vehicle-business.jar和Vehicle-business-exec.jar

 

总结:回到聚合maven上,如果你在root工程中使用了spring-boot-maven-plugin作为builder,那么你的依赖module一定要用解决方案二来设置。否则你不在root工程中用spring-boot-maven-plugin作为builder,而在需要打包module上使用。

jdk8一定要指明

不指明的话在开发工具里运行没有一点问题,如果你没有用到java8的特性打包也没问题。一旦你用到了java8的特性,而且使用spring-boot-maven-plugin作为builder,一定要指明jdk版本。不然你会收到类似不识别Lamda,请使用resource8这样的错误。

<properties>

<java.version>1.8</java.version>

<maven.compiler.source>1.8</maven.compiler.source>

<maven.compiler.target>1.8</maven.compiler.target>

</properties>

BOOT-INF陷阱

这个问题就恶心了。这个时候已经打包成功,你会发现运行jar的时候错为file not found,而且不告诉你什么文件。打开jar去看,发现需要的lib,配置文件,class一样也不缺。

其实这里要说一个概念,spring-boot在打包后,会把文件拷贝到BOOT-INF/Classes之下,这时候你原来定义的扫描路径将失效。而这个问题官方文档根本没讲。

这个陷阱在你使用packages定义扫描路径的时候等着你。或者获取工程下文件的时候。对于获取文件的话,可以在原路径前加上classes,因为你要区分开发环境或生产环境的话,你可以使用profile或者conditional来解决。如果是扫描包路径就恶心了,因为你加上classes之后,不报file not found了。而是不报错,只是警告你找不到hibernate的某些xml。但是你狠可能根本没有使用hibernate。

目前的解决方法是使用register方法代替packages方法,但是问题就是,如果你的类很多,那将是一件痛苦的事情。

服务优雅的下线

application中:

#启用shutdown endpoints.shutdown.enabled=true #禁用密码验证 endpoints.shutdown.sensitive=false

 

在服务上利用curl发送shutdown

curl -X POST http://localhost:8080/shutdown 或者 curl -d "" http://localhost:8080/shutdown

修改内置tomcat版本

1.解析Spring Boot父级依赖

这块配置就是Spring Boot父级依赖,有了这个,当然的项目就是Spring boot项目了,spring-boot-starter-parent是一个特殊的starter,它用来提供相关的Maven默认依赖,使用它之后,常用的包依赖可以省去version标签。

spring boot提供了哪些依赖(1.5.4.RELEASE)

 

 

 

 

 

 

 

 

更换tomcat版本

2.打开这个pom文件,搜索"tomcat.version"会找到<tomcat.version>8.5.16</tomcat.version>

▪️可以直接在这里修改你想要的tomcat版本

▪️在你自己的项目的pom里面添加版本,就可以直接覆盖这里的版本了。如:

添加这个之后,springboot的默认启动的tomcat版本就可以达到你自己需要的了。到这里基本就完成了。但是有时候会启动报错:

Caused by: java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory

  at org.apache.catalina.util.LifecycleBase.<clinit>(LifecycleBase.java:37)

  at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:169)

  at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:164)

  at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134)

  ... 13 common frames omitted

因为这个时候tomcat缺少jar包,maven项目的话加上下面这个依赖就好了:

<dependency>

   <groupId>org.apache.tomcat</groupId>

   <artifactId>tomcat-juli</artifactId>

   <version>${tomcat.version}</version>

 </dependency>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值