今天新来的同事,让他调试短信验证的接口。跟我说添加的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包。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.3.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/aliyun-java-sdk-core-3.3.1.jar</systemPath>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/aliyun-java-sdk-dysmsapi-1.0.0.jar</systemPath>
</dependency>
再看看lib 的存放路径,是和src 平级的目录。
再去tomcat所在的目录下查看,是没有lib里面的两个包的。这种情况肯定是打包的时候没有把本地的jar包打到war包里面。有两个方式可以解决这个问题。
第一种方式,把lib目录添加到WEB-INF目录下面,如下图。因为WEB-INF/lib是会被默认打包的。所以它下面的所有jar包都会被拷贝。
第二种方式,在pom.xml里面添加maven-war-plugin插件,这样也可以把所有maven里面的文件拷贝到war包里面。
<build>
<finalName>xxx</finalName>
...
<plugins>
...//添加下面这个plugin到build里面
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<warName>${project.artifactId}</warName>
<webResources>
<resource>
<directory>lib/</directory>
<targetPath>WEB-INF/lib</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
这个问题应该还是对maven的不熟悉导致的。接下来可以看看maven的一些知识。推荐使用第一种方式,更合maven的逻辑。