解决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>

如有错误还望各位大神指正,万分感谢!