有个项目不是前后端分离的,使用的是传统的模板技术,默认情况下,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