Maven 无法打包jar到 Tomcat

2017-11-09  本文已影响52人  朝圣的路上

今天新来的同事,让他调试短信验证的接口。跟我说添加的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 平级的目录。


image.png

再去tomcat所在的目录下查看,是没有lib里面的两个包的。这种情况肯定是打包的时候没有把本地的jar包打到war包里面。有两个方式可以解决这个问题。

第一种方式,把lib目录添加到WEB-INF目录下面,如下图。因为WEB-INF/lib是会被默认打包的。所以它下面的所有jar包都会被拷贝。


image.png

第二种方式,在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的逻辑。

上一篇下一篇

猜你喜欢

热点阅读