1.问题现象
现在很多项目都是使用maven构建,我在项目中依赖使用了<optional>true</optional>
, 目的是不想依赖传递,但是启动项目的时候出现java.lang.ClassNotFoundException,于是在网上搜了好多资料也没有解决。 自己回想做过什么操作,怀疑自从该依赖使用了<optional>true</optional>
服务就启动保存,因此怀疑<optional>true</optional>
并不只是不传递依赖可能还有其他作用。
2.查阅资料
从Maven官网上搜了一下资料 maven官网,从中看到了一句很重要的话。
Why use optional dependencies?
Optional dependencies save space and memory. They prevent problematic jars that violate a license agreement or cause classpath issues from being bundled into a WAR, EAR, fat jar, or the like.
是不是有种恍然大悟的感觉,optional的作用主要是
- 节约空间和内存
- 防止违背许可协议和类路径问题被打进WAR, EAR, fat jar等中。
3.问题分析
tomcat启动时出现java.lang.ClassNotFoundException异常基本都是jar包没有引用到或者引用的jar有误。此时最好要分析引用jar包是否有冲突,大多数情况都是冲突造成的(项目中有多个版本依赖)。 但是我目前遇到的这种情况是由于使用<optional>true</optional>
造引用jar包并没有被打进war包中,原因是没有license agreement,从而启动报错。
4.问题解决
去掉<optional>true</optional>
以后,然后重新梳理依赖关系,问题解决。
5.问题总结
不管使用什么软件都需要了解其使用和原理,这样出了问题才能游刃有余,最好能通过官网了解其特性,软件官网最好的学习资料。