背景
我把支付模块部署在linux平台上之后,发现无法调用成功,通过观察Catalina.sh发现该模块运行出错误了,主要是以下两个错误:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/pay]]
java.lang.NoClassDefFoundError: com/alipay/api/AlipayRequest
解决
我在CSDN上面看到一位小伙伴的文章:关于 Caused by: java.lang.NoClassDefFoundError: com/alipay/api/AlipayApiException 解决办法,它说可能是支付宝的jar包你没有引入,我想到支付宝jar包是在static下面放着呢,如下图:
在pom.xml文件中找该jar包的方法是:
本地运行是没有错误的,但是在linux平台上该模块就启动失败了,所以我估计打war包的时候支付宝的jar包没有打进去,然后我进入linux平台中支付模块所在的tomcat中的webapps—》WEB-INF—》lib,发现里面确实没有支付宝的jar包,如下图:
然后我通过rz命令去上传了支付宝jar包,重新启动tomcat,没有在出现错误了,估计是模块运行的时候只会去总jar包文件夹下面找jar包,由于打war包的时候没有把支付宝宝jar包打进去,那就无法找到该jar包了,最终导致运行错误
解惑
当前时间是2023-07-02,这篇文章是2年之前写的,当时只知道去解决问题,但是不知道产生问题的原因是什么,也就是没有抓住问题的本质,最近在看《Maven实战》这本书,发现了原因,所以来解答一下两年前自己留下的坑
由于上述依赖的scope属性是system(系统依赖范围),该依赖范围只在编译、测试时有效,但是在运行时无效,详细解释请看:《Maven实战》
P64 表5-1“依赖范围与classpath的关系”
对于springboot项目来说,如果在打包时想要将scope属性为system的jar包打包,那就需要在pom.xml中添加以下配置:
注意:以下为pom.xml文件中的配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- start 允许引入本地jar包 -->
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
<!-- end 允许引入本地jar包 -->
</plugin>
……
</plugins>
……
</build>