【问题标题】:How to automate versioning of static files (css, js, image) in a Java web app如何在 Java Web 应用程序中自动化静态文件(css、js、图像)的版本控制
【发布时间】:2015-04-12 20:00:44
【问题描述】:

我想最有效地使用静态文件的浏览器缓存,即始终使用缓存的内容,除非文件已更改,在这种情况下获取新内容。

我想将文件的 md5 哈希附加到客户端看到的虚拟文件路径(作为目录,或作为文件名的一部分),以便当文件更改时,客户端认为它是不同的资源。

我知道如何使用 servlet 过滤器来接受包含该虚拟文件路径的请求并去除 md5 哈希,并在目录结构中返回真实文件名。

我是否也可以使用过滤器在输出时更改明显的文件名,以便客户端的浏览器认为它正在请求虚拟文件路径,而不更改我的实际文件的实际名称或目录结构?

例如:

真实文件路径 = /css/1.css

虚拟文件路径 = /static/1234/css/1.css

当文件改变时

真实文件路径 = /css/1.css

虚拟文件路径 = /static/3451/css/1.css

【问题讨论】:

  • 你需要重写链接。每当您输出这样的链接时,您都可以调用一个方法来执行此操作。您使用什么技术来生成 HTML?
  • 使用jsf和html5。 css、js、图片直接在xhtml中。命令链接和按钮用于控制流向不同的 xhtml 页面
  • JSF 有内置的解决方案,并通过资源处理程序拥有可定制的方法。为什么在标题/问题中“使用 servlet”和“使用 servlet 过滤器”?请编辑和澄清。当前形式的问题与 JSF 无关。如果您实际上没有通过<h:outputStylesheet> 和朋友将它们用作 JSF 资源,那肯定不会。
  • 知道了 - 我想我的标题让这个问题感到困惑。使用 servlet/servlet 过滤器是我目前关于如何解决问题的想法——我应该从标题中删除它。应用程序运行的技术是 jsf、java 8、maven、html5、mongoDb。我正在此技术堆栈中寻找解决方案。

标签: java javascript css maven jakarta-ee


【解决方案1】:

如果您使用的是 Maven,您可以添加这个很棒的插件:Minify Maven Plugin。它与您的问题没有直接关系,但您可以使用 ${version} 将 CSS/JS 文件的最终名称与应用程序的版本连接起来(您应该能够在您的进口)。 每次构建应用程序的新版本时,都应该有新的 CSS/JS 文件(按新版本号)并强制浏览器重新下载。

例子:

<plugin>
    <groupId>com.samaxes.maven</groupId>
    <artifactId>minify-maven-plugin</artifactId>
    <version>1.7.4</version>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>minify</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <webappSourceDir>${basedir}/src/main/webapp/</webappSourceDir>
        <webappTargetDir>${basedir}/src/main/webapp/</webappTargetDir>
        <charset>UTF-8</charset>
        <cssSourceDir>css</cssSourceDir>
        <cssSourceFiles>
            <cssSourceFile>style.css</cssSourceFile>
        </cssSourceFiles>
        <cssTargetDir>css</cssTargetDir>
        <!-- Your final CSS file -->
        <cssFinalFile>style.final.${version}.css</cssFinalFile>

        <jsSourceDir>js</jsSourceDir>
        <jsSourceFiles>
            <jsSourceFile>script.js</jsSourceFile>
        </jsSourceFiles>
        <jsTargetDir>js</jsTargetDir>
        <!-- Your final JS file -->
        <jsFinalFile>script.final.${version}.js</jsFinalFile>
        <jsEngine>CLOSURE</jsEngine>
    </configuration>
</plugin>

【讨论】:

  • 这是一个我不知道的有趣选项。我们正在评估是否可以将其与使用版本号来识别当前静态文件的脚本结合使用。在这种情况下,源文件将位于其原始目录中,但构建后的目标文件将位于基于 Maven 构建版本号的目录中。我们将构建一个脚本来识别静态文件的文件路径。谢谢 - 如果没有更好的建议,我们将在下周尝试,并报告结果。
  • 希望对您有所帮助。有关更多信息,我在 maven-war-plugin 配置中列出了 中的源文件。此外,我在 maven-clean-plugin 配置中包含了版本化文件,因此我摆脱了旧版本。
猜你喜欢
  • 2018-05-19
  • 1970-01-01
  • 2011-06-18
  • 2023-03-15
  • 1970-01-01
  • 2013-03-10
  • 2017-07-17
  • 2011-06-13
  • 2010-12-30
相关资源
最近更新 更多