解决maven打包排除webapp目录失效的问题
- 现象
- 解决办法
- 总结
- 最终简化版
现象
spring boot整合vue和element ui在前后端不完全分离的情况下进行开发(有兴趣的同学可以参考https://github.com/xichengxml/springboot-vue-template),然后发现在resources目录下的webapp文件夹下的前端工程源码会被maven同步编译打包,导致项目编译严重变慢,在网上找了各种方法尝试都尝试无效,其实是遇到了一个坑,因为对maven打包不太熟悉,自己坑了自己一把。
解决办法
尝试了网上说的如下方法,发现没有效果,然后就添加其他的各种编译插件,maven-jar-plugin和maven-resources-plugin均尝试过了,发现都无效。后来发现其实下面这种方式是有效的,参考文章:
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<excludes>
<exclude>webapp/**</exclude>
</excludes>
</resource>
</resources>
最后查出根本原因竟然是使用了多个resource导致的,因为之前遇到字体经过maven打包之后在前端显示不了的问题,所以添加了一个标签
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.ttf</exclude>
<exclude>**/*.woff</exclude>
</excludes>
</resource>
刚好这个标签没有排除webapp文件夹,所以前面虽然排除了,但是这里还是会将webapp打包进去,正确的写法应该是
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.ttf</exclude>
<exclude>**/*.woff</exclude>
<exclude>webapp/**</exclude>
</excludes>
</resource>
还有项目当中使用了maven profile进行多环境配置,所以再加多了一个标签
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
此处同样没有排除webapp文件夹,正确写法应该为:
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>webapp/**</exclude>
</excludes>
</resource>
总结
凡是所有的resource标签带有filtering属性为true的情况下均要添加<exclude>webapp/**</exclude>
,最终的pom文件为:
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<excludes>
<exclude>webapp/**</exclude>
</excludes>
</resource>
<!-- 解决字体文件 -->
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.ttf</exclude>
<exclude>**/*.woff</exclude>
<exclude>webapp/**</exclude>
</excludes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.ttf</include>
<include>**/*.woff</include>
</includes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>webapp/**</exclude>
</excludes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources/${env}</directory>
</resource>
</resources>
</build>
需要注意的是:因为字体加了特殊配置,所以如果webapp文件夹下有.ttf和.woff结尾的文件会同样被打包进去,这个可以根据实际情况再进行调整
最终简化版
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<!--此配置为/src/main/resources/static文件夹下的所有文件均不走maven的过滤器打包,防止字体文件前端识别不了-->
<!--只打包/src/main/resources/static文件夹下的所有文件-->
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>static/**</include>
</includes>
</resource>
<!--此配置为/src/main/resources目录下除了static和webapp文件夹下的所有文件均使用maven过滤器打包-->
<!--打包所有/src/main/resources目录下除了static和webapp文件夹下的所有其他文件-->
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>webapp/**</exclude>
<exclude>static/**</exclude>
</excludes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources/${env}</directory>
</resource>
</resources>
</build>
如有错误还望各位大神指正,万分感谢!