2013-03-18 3 views
3

Java/Maven 프로젝트에서 수정 된 JavaScript/CSS 리소스를 다시로드하기 위해 브라우저 캐시를 관리하는 최상의 솔루션을 찾으려고합니다. 가장 널리 보급 된 솔루션은 Maven 필터링으로 빌드 타임에 리소스 URL에 타임 스탬프를 추가하는 것 같습니다. 예를 들어 :Java/Maven 방식으로 URL 지문을 사용하여 공격적인 캐싱 관리

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

그러나 가장 효율적인 방법은 자원이 각 배포 후 다시로드하지만, 필요한 경우에만되지 않도록 빌드 날짜 대신 (지문 일명) 파일의 체크섬/해시를 추가하는 것입니다. Java 또는 Maven 플러그인을 사용하여이 모델의 올바른/일반적인 구현을 필사적으로 찾고 있습니다.

아이디어가 있으십니까?

감사합니다.

답변

3

핑거 프린팅과 쿼리 매개 변수를 사용하고 싶습니다. 쿼리 매개 변수 메서드는 항상 작동하지 않으며 대부분의 프록시는 쿼리를 캐시하지 않습니다. URL 또는 실제 파일 이름을 변경하는 것이 좋습니다.

그래서 Maven, Git, Tomcat, Dojo 프로젝트에서이 문제를 처리하고 있습니다. 나는 Git rev를 얻기 위해 http://mojo.codehaus.org/buildnumber-maven-plugin/을 사용한다. 그리고 내 WAR를 빌드 할 때 필터링을 사용하여 JSP에 값을 삽입하십시오. 내 주요 JSP에서

<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> 

의 pom.xml 내가 http://tuckey.org/urlrewrite/을 사용하고 재 작성 작업을 수행하려면

<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> 

이 포함되어 있습니다. 나는 단지 하나의 간단한 규칙 만 가지고있다.

내 첫 번째 필터 항목의 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> 
+1

유용한 URL 다시 작성 부분을 가져 주셔서 감사합니다. 하지만 빌드 번호는 $ {maven.build.timestamp}와 거의 같은 동작을합니다. 자산이 변경되지 않은 경우에도 새 버전이 나올 때마다 자산이 다시 다운로드됩니다. – benweet

+0

아마도 당신의 질문을 이해하지 못했습니다. 배포간에 변경된 파일 만 강제로 적용 하시겠습니까? – denov

+0

나는 모든 js 코드를 몇 개의 파일로 컴파일하고 크기를 줄인다. 그래서 나는 정말로 파일에 어떤 변화가 있는지 걱정할 필요가 없다. 사용자는 각 업데이트에서 js 파일을 다운로드하면됩니다. – denov

0

나는 아직 사용하지 않지만, maven-fingerprint-plugin 좋은 것 같다.

약간의 메이븐 구성 만 있으면됩니다. 그러면 파일의 모든 URL이 핑거 버전으로 자동으로 리빌드됩니다. 자원 URL에 $ {buildNumber}, $ {hashVersion} 또는 기타 지문 선택을 수동으로 유지할 필요가 없습니다.

저장소에서

:

<pluginRepositories> 
    <pluginRepository> 
        <id>fprint-repo</id> 
        <url>https://raw.github.com/dernasherbrezon/maven-fingerprint-plugin/master/maven-fingerprint-plugin/mvn-repo</url> 
    </pluginRepository> 
</pluginRepositories> 

다음

<executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>generate</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <excludeResources> 
         <excludeResource>://</excludeResource> 
         <excludeResource>//</excludeResource> 
        </excludeResources> 
<!-- ${basedir}/src/main/webapp by default --> 
        <sourceDirectory>${basedir}/target/webcombined</sourceDirectory> 
<!-- ${project.build.directory}/fingered-web by default --> 
        <outputDirectory>${basedir}/target/fingered</outputDirectory> 
<!-- Remove unnecessary spaces between tags. Make single line page. Takes into consideration <pre> tags --> 
        <trimTagExtensions> 
         <trimTagExtension>html</trimTagExtension> 
        </trimTagExtensions> 
        <extensionsToFilter> 
         <extensionToFilter>html</extensionToFilter> 
         <extensionToFilter>jsp</extensionToFilter> 
         <extensionToFilter>tag</extensionToFilter> 
         <extensionToFilter>css</extensionToFilter> 
         <extensionToFilter>js</extensionToFilter> 
        </extensionsToFilter> 
<!-- cdn host. Not required. For example using "//accountname.r.worldssl.net": /css/bootstrap.css -> //accountname.r.worldssl.net/css/<md5>bootstrap.css --> 
        <cdn>${cdn}</cdn> 
       </configuration> 

을하고 그게 다에요.