2011-03-22 123 views
9

我有一個包含CSS鏈接,看起來JSP搖籃替換JSP的文字像使用過濾器

<link type="text/css" href="/css/login-min.css" rel="stylesheet" /> 

爲了使瀏覽器緩存的CSS文件中,我們用CSS的名稱和替換login-min.css時間戳或版本號

login-min.css?t=432432423423... 

在螞蟻我會做類似

<tstamp> 
    <format property="current.time" pattern="MMddyyyyhhmmssaa" offset="-5" unit="hour" /> 
</tstamp> 

<replace dir="${deploy.path}/${name}/WEB-INF/jsp" value="login-min.css?t=${current.time}"> 
    <include name="includes/login_css_include.jsp" /> 
    <replacetoken>login-min.css</replacetoken> 
</replace> 

對於gradle這個我已經更新了jsp頁面看起來像

<link type="text/css" href="/css/@[email protected]" rel="stylesheet" /> 

,並在的build.gradle正在做

import org.apache.tools.ant.filters.ReplaceTokens 
war { 
    webInf { 
    from ("${webAppDir}/WEB-INF/jsp") { 
     include: "/includes/login_css_include.jsp" 
     filter(ReplaceTokens, tokens: [loginCSS: 'login-min.css?v=1']) 
    } 
    } 
} 

,但是這是行不通的。

這一個工程,但它改變了源...我只是想修改戰爭中的文件。

import org.apache.tools.ant.filters.ReplaceTokens 
war { 
    webInf { 
    from ("${webAppDir}/WEB-INF/jsp/includes/login_css_include.jsp") { 
     it.eachFile { 
     ant.replace(file: it.file, token: "@[email protected]", value: "login-min.css?v=1") 
     } 
    } 
    } 
} 

我全新到搖籃我要對這個完全錯誤的?任何人都需要做這樣的事情?使用gradle 1.0-milestone-1。

感謝

+0

您是否用'gradle -i'或'gradle -d'運行以獲取有關構建戰爭時發生的事情的更多信息? – 2011-03-23 02:17:04

+0

@Emil - 感謝您的關注。我從來沒有用過這些選擇,第一次嘗試似乎沒有做任何事情,第二次沒有做我想做的事,所以我沒有做得更多,可能應該有。如果你想看一下,我的答案確實有效。這可能不是一個非常聰明的方式,但它確實能完成這項工作。 – Josh 2011-03-23 02:56:21

回答

10

好吧,這似乎工作:

jsp頁面

<link type="text/css" href="/css/@[email protected]" rel="stylesheet" /> 

構建。gradle這個

war { 
    filter(ReplaceTokens, tokens: ['loginCSS': 'login-min.css']) 
} 
+0

當我在'filter(ReplaceTokens,tokens:[loginCSS:「login-min.css?t = $ {now}」,allCSS:「all-min.css?t = $)中添加時間戳時,這不起作用{now}「,allJS:」all-min.js?t = $ {now}「])'。我得到'原因:org.codehaus.groovy.runtime.GStringImpl不能轉換爲java.lang.String' – Josh 2011-04-15 13:43:33

+1

@josh,我通過使用toString()來解決相同的場景。在你的例子中,它看起來像這樣:filter(ReplaceTokens,tokens:[loginCSS:「login-min.css?t = $ {now}」。toString(),allCSS:「all-min.css?t = $ {now}「。toString,allJS:」all-min.js?t = $ {now}「。toString()]) – 2011-09-15 14:13:49

+0

這將改變我的文件的編碼,例如jsp文件。無論如何,我們可以保留或設置文件編碼? – Ben 2017-12-05 15:37:07

4

不知道這是否與常規/ gradle這個款式適合我這是怎麼能做到這一點。

JSP文件現在看起來是這樣的:

<link type="text/css" href="/css/${loginCSS}" rel="stylesheet" /> 

像這樣的gradle.build:

war { 
    eachFile { 
    if (it.name == 'login_css_include.jsp') { 
     it.expand(loginCSS: "login-min.css?v=1") 
    } 
    } 
} 

利用時間戳看起來是這樣的:

war { 
    eachFile { 
    if (it.name == 'login_css_include.jsp') { 
     def now = new Date() 
     it.expand(loginCSS: "login-min.css?t=${now.getTime()}") 
    } 
    } 
} 

編輯 - 如Axel在評論中指出下面這個解決方案,它在使用JSP EL expr跨二進制文件或文件運行時遇到了麻煩寬恕請求。

+1

這使我失敗,因爲它奇怪地試圖替換二進制文件中的標記(在我的情況下爲favicon.ico)。此外它似乎與JSP EL衝突... – 2011-03-23 08:00:31

+0

我遇到了完全相同的事情。當它遇到一些jstl的東西時,我得到了EOL解析錯誤。它在這種情況下起作用,因爲我正在查看非特定文件,該文件不是二進制文件,並且沒有jstl。我接受另一種解決方案,在所有情況下效果更好,但我沒有找到它。 – Josh 2011-03-23 11:13:04

0

我們已經做過類似的(但不是完全一模一樣的)事情只是創造java.io.File S和操縱它們,然後包括他們到使用from{}webInf{}fileTree將.war。

你可以看看類似的東西,但由於這似乎是由螞蟻處理得很好,你有沒有直接從gradle like this使用螞蟻看?

+0

我敢打賭,我可以在eachFile中做一個ant.replace,類似於我的答案中的擴展。這可能會解決該解決方案所具有的二進制和jstl問題。我必須嘗試。 – Josh 2011-03-24 01:20:41

5

又一變嘗試(它在我的情況下,克服了這個bug http://issues.gradle.org/browse/GRADLE-1566#

war { 
    eachFile { 
     if (it.name == 'yourFile.jsp') { 
     it.filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: [...]) 
     } 
    } 
} 
+0

這對我有幫助。我正在做一些有擴張功能的東西。選擇我想用這個策略「擴展」的文件解決了這個問題。 – 2013-07-08 21:15:50

0

您還可以通過設置編碼(因爲默認情況下它會改變文件編碼):

war { 
    filteringCharset = 'UTF-8' 
    filesMatching('**/*.jsp') { 
     filter ReplaceTokens, tokens: [ 
       'versionDate': "${new Date().format('yyyyMMdd')}".toString(), 
       'copyright' : "${new Date().format('yyyy')}".toString() 
     ] 
    } 
}