0

    MAVEN打包时自动给静态文件添加时间戳

    2023.11.25 | admin | 62次围观

    每次 maven 打包更新时,静态文件的路径不会变,如果用户不清缓存的话,就存在更新不及时的问题.所以需要在打包时自动添加时间戳,以实现用户无需清缓存就能使用到最新版本的目标。

    一、添加时间戳 (一)思路

    因为不是前后端分离用 webpack 打包,直接修改文件名不是非常现实,那么请求时加参数的方法算是一个比较简单的解决方案。

    我的需求中需要完成几件事:

    将 html 文件中的 js 和 css 引用都添加时间戳参数将 ftl 文件(FreeMarker)中的 js 和 css 引用都添加时间戳参数。如果用的是其他的模版语言,也可以类似参考将 requirejs 的请求统一添加时间戳参数 (二)依赖

    这边要用到 Google 的一个 replacer 插件,可以在最终打包前替换文件内容。原名为 maven-replacer-plugin,2012 年后改名为 replacer。到现在为止最新版本为 2014 年 4 月 16 日发布的 1.5.3 版本。

    如果没有指定 basedir,则后面的文件路径都要写绝对路径。可以通过 includes 和 excludes 指定包含和排除的文件,也可以通过 file 来指定特定文件。

    (三)pom.xml 参考

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68

    <project>
    <properties>
    <maven.build.timestamp.format>yyyyMMddHHmmssmaven.build.timestamp.format>
    properties>
    <dependencies>

    <dependency>
    <groupId>com.google.code.maven-replacer-plugingroupId>
    <artifactId>replacerartifactId>
    <version>1.5.3version>
    dependency>

    dependencies>
    <build>
    <plugins>

    <plugin>
    <groupId>com.google.code.maven-replacer-plugingroupId>
    <artifactId>replacerartifactId>
    <version>1.5.3version>
    <executions>
    <execution>
    <phase>prepare-packagephase>
    <goals>
    <goal>replacegoal>
    goals>
    execution>
    executions>
    <configuration>

    <basedir>${project.build.directory}basedir>
    <includes>

    <include>*.ftlinclude>
    <include>**/*.ftlinclude>
    <include>*.htmlinclude>
    <include>**/*.htmlinclude>
    includes>
    <replacements>

    <replacement>
    <token>\.css\"token>
    <value>.css?v=${maven.build.timestamp}\"value>
    replacement>
    <replacement>
    <token>\.css\'token>
    <value>.css?v=${maven.build.timestamp}\'value>
    replacement>
    <replacement>
    <token>\.js\"token>
    <value>.js?v=${maven.build.timestamp}\"value>
    replacement>
    <replacement>
    <token>\.js\'token>
    <value>.js?v=${maven.build.timestamp}\'value>
    replacement>

    <replacement>
    <token>urlArgs: \'v=#\{.*\}\'token>
    <value>urlArgs: \'v=#\{${maven.build.timestamp}\}\'value>
    replacement>
    replacements>
    configuration>
    plugin>

    plugins>
    build>
    project>

    二、时间戳时区

    上面的配置其实已经可以解决问题了。但因为maven.build.timestamp使用的是 UTC 时间,无法配置时区,我们可以看到添加的时间戳与北京时间差了 8 小时。

    不过自带组件解决不了引用js文件加上时间戳引用js文件加上时间戳,我们可以用其他组件解决一下。

    这里引入 build-helper-maven-plugin 插件来添加一个当前时区的时间属性build.time,然后将maven.build.timestamp替换成build.time即可。

    完整参考:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89

    <project>
    <dependencies>

    <dependency>
    <groupId>com.google.code.maven-replacer-plugingroupId>
    <artifactId>replacerartifactId>
    <version>1.5.3version>
    dependency>
    <dependency>
    <groupId>org.codehaus.mojogroupId>
    <artifactId>build-helper-maven-pluginartifactId>
    <version>3.3.0version>
    dependency>

    dependencies>
    <build>
    <plugins>

    <plugin>
    <groupId>org.codehaus.mojogroupId>
    <artifactId>build-helper-maven-pluginartifactId>
    <version>3.3.0version>
    <executions>
    <execution>
    <id>timestamp-propertyid>
    <goals>
    <goal>timestamp-propertygoal>
    goals>
    <configuration>
    <name>build.timename>
    <pattern>yyyyMMddHHmmsspattern>
    <locale>zh_CNlocale>
    <timeZone>GMT+8timeZone>
    configuration>
    execution>
    executions>
    plugin>
    <plugin>
    <groupId>com.google.code.maven-replacer-plugingroupId>
    <artifactId>replacerartifactId>
    <version>1.5.3version>
    <executions>
    <execution>
    <phase>prepare-packagephase>
    <goals>
    <goal>replacegoal>
    goals>
    execution>
    executions>
    <configuration>

    <basedir>${project.build.directory}basedir>
    <includes>

    <include>*.ftlinclude>
    <include>**/*.ftlinclude>
    <include>*.htmlinclude>
    <include>**/*.htmlinclude>
    includes>
    <replacements>

    <replacement>
    <token>\.css\"token>
    <value>.css?v=${build.time}\"value>
    replacement>
    <replacement>
    <token>\.css\'token>
    <value>.css?v=${build.time}\'value>
    replacement>
    <replacement>
    <token>\.js\"token>
    <value>.js?v=${build.time}\"value>
    replacement>
    <replacement>
    <token>\.js\'token>
    <value>.js?v=${build.time}\'value>
    replacement>

    <replacement>
    <token>urlArgs: \'v=#\{.*\}\'token>
    <value>urlArgs: \'v=#\{${build.time}\}\'value>
    replacement>
    replacements>
    configuration>
    plugin>

    plugins>
    build>
    project>

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    标签: 时间戳
    发表评论