有个项目不是前后端分离的,使用的是传统的模板技术,默认情况下,Spring Boot打包时,会把静态文件也打包到jar包中,,而这些静态资源往往比较大,每次小改动,都导致发布上传一个大的jar包,很浪费时间,于是想到把 前端资源(js/css/image等)剥离出来,
pom.xml配置参考如下:
<build>
<!-- 打包后的文件名 -->
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>static/**</exclude>
</excludes>
</resource>
</resources>
</build>
然后,那些静态资源就用nginx来代理访问一下即可。系统部署目录规划如下:
- /www/wwwroot/edm_sys/web:放 静态资源
- /www/wwwroot/edm_sys/server:放 jar包
Nginx配置参考如下:
upstream Edm_Admin_Server {
server 127.0.0.1:30030;
}
server
{
listen 80;
server_name edm.xxx.com;
index index.html default.html;
root /www/wwwroot/edm_sys/web;
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#SSL-END
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/edm.xxx.com.conf;
#REWRITE-END
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
#禁止在证书验证目录放入敏感文件
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
access_log /www/wwwlogs/edm_sys.log;
error_log /www/wwwlogs/edm_sys.error.log;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://Edm_Admin_Server/;
}
}
问题1:
引发的另外一个问题:在本地开发时,还是希望使用Spring Boot来处理静态资源。但上面的配置,因为jar包里面没有静态资源文件了,且又没有在本地配置Nginx访问时,访问静态资源会报404错误!
解决方案:
根据Maven多环境变量的特性,配置至少2个不同的环境变量,当是正式环境时,就排除静态资源,否则就再次包含静态资源
<project ....>
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<include_static_path>
src/main/resources
</include_static_path>
</properties>
</profile>
<profile>
<id>pro</id>
<properties>
<include_static_path> <!-- 定义了一个静态文件目录变量,然后随便给它一个不存在的目录值,这样就不会真包含静态资源文件 -->
src/main/resources_333
</include_static_path>
</properties>
</profile>
</profiles>
<build>
<plugins>
<!-- 模块单独打包插件(完整的SpringBoot Jar包项目) -->
<!-- spring-boot-maven-plugin (提供了直接运行项目的插件:如果是通过parent方式继承spring-boot-starter-parent则不用此插件) -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
<resources>
<!-- (1)刚开始先排除静态文件 -->
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>static/**</exclude>
</excludes>
</resource>
<!-- (2)按实际情况,通过变量决定是否再次包含静态文件 -->
<resource>
<directory>${include_static_path}</directory>
<includes>
<include>static/**</include>
</includes>
</resource>
</resources>
</build>
</project>
问题2:
通过解决问题1,上面打包确实没有问题,但是 IDEA 本地调试出问题了:不能正常打包静态资源文件,即 /static/** 文件夹内容没有加载进来,此时前端页面就是无 css 和 无图片的混乱的页面了。
解决方案:
每次前端有修改,先点击一下maven的clean菜单,再点package菜单,如下图所示:

参考:
- Spring Boot maven打包时排除资源目录
- Maven 学习笔记 多环境配置
- Springboot与Maven多环境配置文件夹解决方案
- 通过Maven Profiles的方式进行Spring Boot多环境配置
- Springboot maven方式多环境配置
- Maven中filtering的使用
- [每日学一点] pom中的filtering