首要原因:项目发布后对应依赖的包没有发布在web-inf下的lib里

根本原因:Maven创建的普通项目而不是web项目,缺少插件

解决办法1:这是由于pom.xml中下载的jar包未被部署。我们先ctrl+shift+alt+s打开Project Structure窗口,选择Artifacts,选择要打包部署的项目,在Output Layout –> Web-INF查看是否有lib目录,如果右边Available Elements窗口还显示有jar包,说明这些jar包未添加,则应右击选择Put into Output Root,这样就OK啦~

解决方法2:

项目中的jar包一部分是基于pom文件依赖,一部分是用BuildPath放入WEB-INF/lib目录下,最后在使用maven打包的时候,发现无法把WEB-INF/lib下的jar包打到war包里面,导致引入WEB-INF/lib目录中jar的类无法编译而出错。

解决方式:

在pom文件里面加入如下maven插件:

<build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
          <encoding>UTF-8</encoding>
               <compilerArguments>
                  <!-- <extdirs>{basedir}/WebRoot/WEB-INF/lib</extdirs> -->
                   <extdirs>{basedir}/src/main/webapp/WEB-INF/lib</extdirs>
               </compilerArguments>
        </configuration>
      </plugin>
    </plugins>
  </build>

加入这段代码之后,重新使用maven打包编译就可以把WEB-INF/lib目录下的jar包和pom文件依赖的jar包都打进war包里面了
自动添加classpath

普通Java Web项目为什么lib包要放在WEB-INF下

首先一个项目要编译好之后才能部署到Tomcat中运行。

Tomcat运行时如何找编译好的.class文件呢,其实Tomcat下的web项目有两个预置的classpath(就是能找到.class文件的入口),

这两个预置的classpath是WEB-INF/classes与WEF-INF/lib,

其中我们src下的源文件经过了编译之后放在WEB-INF/classes目录下,

而lib包在编译前需要放在WEB-INF下编译后才能出现在WEF-INF/lib目录下

所以说lib包下如果没有放在WEB-INF下编译后就不会出现在WEB-INF/lib下,从而不会被Tomcat找到。


醉后不知天在水,满船清梦压星河