3

Java/Maven プロジェクトで変更された JavaScript/CSS リソースをリロードするためにブラウザー キャッシュを管理するための最適なソリューションを見つけようとしています。最も普及しているソリューションは、ビルド時にタイムスタンプをリソース URL に追加する Maven フィルタリングのようです。例えば:

<script type="text/javascript" src="resource.js?v=${maven.build.timestamp}"></script>

ただし、最も効率的な方法は、ビルド日の代わりにファイルのチェックサム/ハッシュ (別名フィンガープリント) を追加して、各デプロイ後にリソースがリロードされるのではなく、必要な場合にのみリロードされるようにすることです。Java または Maven プラグインを使用して、このモデルの正しい/汎用的な実装を必死に探しています。

何か案は?

ありがとう。

4

2 に答える 2

3

フィンガープリントとクエリ パラメータを使用したい。query param メソッドは常に機能するとは限らず、ほとんどのプロキシはそれをキャッシュしません。URL または実際のファイル名を変更すると、より効果的です。

Maven、Git、Tomcat、Dojo プロジェクトでこれをどのように扱っているかを次に示します。http://mojo.codehaus.org/buildnumber-maven-plugin/を使用して Git rev を取得します。次に、WAR をビルドするときにフィルタリングを使用して、値を JSP に挿入します。

pom.xml

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>buildnumber-maven-plugin</artifactId>
        <version>1.1</version>
        <executions>
            <execution>
                <phase>validate</phase>
                <goals>
                    <goal>create</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <doCheck>false</doCheck>
            <doUpdate>false</doUpdate>
            <shortRevisionLength>8</shortRevisionLength>
            <revisionOnScmFailure></revisionOnScmFailure>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
            <warName>${project.name}-${project.version}-${buildNumber}</warName>
            <webResources>
                <resource>
                    <directory>src/main/webapp/WEB-INF/views/includes</directory>
                    <targetPath>WEB-INF/views/includes</targetPath>
                    <filtering>true</filtering>
                </resource>
            </webResources>                  
            ......
        </configuration>
    </plugin>

私のメインのJSPには、私が持っている

<script src="${pageContext.request.contextPath}/${buildNumber}/static/js/ckeditor/ckeditor.js"></script>
<script src="${pageContext.request.contextPath}/${buildNumber}/static/js/build/dojo/dojo.js"  data-dojo-config="parseOnLoad: true"></script>

書き換えを行うには、http://tuckey.org/urlrewrite/を使用しています。私にはたった1つの簡単なルールがあります。

私の最初のフィルター エントリ web.xml

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    <init-param>
        <param-name>logLevel</param-name>
        <param-value>WARN</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

urlrewrite.xml

<rule match-type="regex">
    <from>^/[0-9A-Za-z_.\-]+/static/(.*)$</from>
    <to>/static/$1</to>
</rule>
于 2013-07-29T20:16:46.977 に答える