作者:浅唱_夏染_744 | 来源:互联网 | 2024-09-26 10:33
今天新来的同事,让他调试短信验证的接口。跟我说添加的aliyun的短信验证服务无法在tomcat上运行。然后给我看了报错信息:java.lang.NoClassDefFoundEr
今天新来的同事,让他调试短信验证的接口。跟我说添加的aliyun的短信验证服务无法在tomcat上运行。然后给我看了报错信息:
java.lang.NoClassDefFoundError: com/aliyuncs/exceptions/ClientException
java.lang.Class.getDeclaredMethods0(Native Method)
java.lang.Class.privateGetDeclaredMethods(Unknown Source)
java.lang.Class.getDeclaredMethods(Unknown Source)
org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:606)
org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:518)
org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:504)
其实看第一行就知道,是阿里云的jar包没有添加进来。我看了同步了一下工程。首先看编译能通过,pom.xml里面有相应的信息。maven dependency里面也有相应的jar包。
com.aliyun
aliyun-java-sdk-core
3.3.1
system
${project.basedir}/lib/aliyun-java-sdk-core-3.3.1.jar
com.aliyun
aliyun-java-sdk-dysmsapi
1.0.0
system
${project.basedir}/lib/aliyun-java-sdk-dysmsapi-1.0.0.jar
再看看lib 的存放路径,是和src 平级的目录。
image.png
再去tomcat所在的目录下查看,是没有lib里面的两个包的。这种情况肯定是打包的时候没有把本地的jar包打到war包里面。有两个方式可以解决这个问题。
第一种方式,把lib目录添加到WEB-INF目录下面,如下图。因为WEB-INF/lib是会被默认打包的。所以它下面的所有jar包都会被拷贝。
image.png
第二种方式,在pom.xml里面添加maven-war-plugin插件,这样也可以把所有maven里面的文件拷贝到war包里面。
xxx
...
...//添加下面这个plugin到build里面
org.apache.maven.plugins
maven-war-plugin
2.4
${project.artifactId}
lib/
WEB-INF/lib
**/*.jar
这个问题应该还是对maven的不熟悉导致的。接下来可以看看maven的一些知识。推荐使用第一种方式,更合maven的逻辑。