问题描述
在idea中,当我们手动创建使用了Maven的java web项目,虽然我们已经在Project Structure中的添加了web facet和对应的war exploded artifact后,一切都可以正常运行。但唯独在我们修改(添加、删除)jar包后,lib文件夹不能即时的对应更新,需要手动在war exploded artifact中修改(把新增的添加、删除了的去掉)。
原因分析
由于本项目使用了Maven来打包编译,但Maven没有在每次打包编译时更新对应的jar包到lib文件夹中。其根本原因是项目的Maven配置认为本项目的打包方式是默认的jar方式,故没有更新lib文件夹。我们需要把本项目的打包方式设置为war即可。
解决方法
在pom.xml中设置war打包方式:
<packaging>war</packaging>
这样lib文件夹就会在每次打包编译时更新了。
附加问题及处理
但是,修改了pom.xml文件后,当我们每次更新maven配置(即点击Maven窗口的reload all maven projects按钮)后,idea会去读取Maven的配置并解析到项目的相关配置项中,项目的web facet里面的设置会变回maven的默认配置。如war source directory(web的根目录)在 b a s e d i r / s r c / m a i n / w e b a p p 中 , 而 我 的 项 目 的 w a r s o u r c e d i r e c t o r y 在 {basedir}/src/main/webapp中,而我的项目的war source directory在 basedir/src/main/webapp中,而我的项目的warsourcedirectory在{basedir}/web中。这样就造成了对应的war exploded artifact不能工作了。由于项目的packing为war,默认使用maven-war-plugin来打包。此时,我们需要在pom.xml中设置maven-war-plugin设置相关的配置即可。如设置web项目的warSourceDirectory在${basedir}/web中。
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<warSourceDirectory>${basedir}/web</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
这样每次刷新maven配置,idea就会读到对应正确的路径,不会报错了。所有一切均可以正常工作了。
关于maven-war-plugin的war exploded参数可以参考官方网页:
Apache Maven WAR Plugin – war:exploded