不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:php-note.com  发布于:2022-09-09 15:13  分类:Java框架/系统  编辑

有个项目不是前后端分离的,使用的是传统的模板技术,默认情况下,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来代理访问一下即可。系统部署目录规划如下:

  1. /www/wwwroot/edm_sys/web:放 静态资源
  2. /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菜单,如下图所示:

 

 

参考:

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