2011-03-22 127 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() 
     ] 
    } 
}