使用过滤器渐变替换jsp中的文本
我有一个jsp,其中包含一个css链接使用过滤器渐变替换jsp中的文本,jsp,build,replace,gradle,Jsp,Build,Replace,Gradle,我有一个jsp,其中包含一个css链接 <link type="text/css" href="/css/login-min.css" rel="stylesheet" /> 在ant中,我会做类似的事情 <tstamp> <format property="current.time" pattern="MMddyyyyhhmmssaa" offset="-5" unit="hour" /> </tstamp> <replace di
<link type="text/css" href="/css/login-min.css" rel="stylesheet" />
在ant中,我会做类似的事情
<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>
但这不起作用
这一个工作,但它改变了来源。。。我只想修改战争中的文件
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: "@loginCSS@", value: "login-min.css?v=1")
}
}
}
}
我是gradle的新手我是不是完全错了?以前有人需要这样做吗?使用gradle 1.0-milestone-1
谢谢我不确定这是否适合groovy/gradle风格这就是我如何做到这一点的 jsp文件现在如下所示:
<link type="text/css" href="/css/${loginCSS}" rel="stylesheet" />
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()}")
}
}
}
使用时间戳如下所示:
<link type="text/css" href="/css/${loginCSS}" rel="stylesheet" />
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表达式的文件时会遇到问题。我们做过类似(但不完全相同)的事情,只是创建java.io.File
s并对其进行操作,然后使用{}中的将其包含到.war中
或带有文件树的webInf{}
您可以研究类似的问题,但由于ant似乎处理得很好,您是否研究过直接从gradle使用ant?好的,这似乎有效:
jsp页面:
<link type="text/css" href="/css/@loginCSS@" rel="stylesheet" />
war {
filter(ReplaceTokens, tokens: ['loginCSS': 'login-min.css'])
}
还有另一个要尝试的变体(在我的例子中,它可以克服这个bug)
您还可以设置编码方式(因为默认情况下,它将更改文件编码):
您是否使用gradle-i
或gradle-d
来获取更多关于您构建战争时发生的事情的信息?@Emil-感谢您的关注。我从来没有使用过这些选项,第一次尝试似乎没有做任何事情,第二次没有做我想做的事情,所以我没有走得更远,也许我应该这样做。如果你想看一看,我下面的答案确实有用。这可能不是一种非常聪明的方法,但它确实起到了作用。这让我很失望,因为它奇怪地试图替换二进制文件中的令牌(在我的例子中是favicon.ico)。而且它似乎与JSP EL冲突…我遇到了完全相同的事情。我在遇到一些jstl东西时遇到了EOL解析错误。它在这种情况下起作用,因为我看到的是一个非常特殊的文件,它不是二进制文件,也没有jstl。我对另一种在所有情况下都能更好地工作的解决方案持开放态度,但我还没有找到它。我打赌一种解决方案可以在每个文件中执行ant.replace,类似于我答案中的expand。这可能会绕过解决方案中存在的二进制和jstl问题。当我在过滤器(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,我使用toString()解决了同样的问题。在您的示例中,它看起来是这样的:filter(ReplaceTokens,tokens:[loginCSS:$login-min.css?t=${now}.toString(),allCSS:$all-min.css?t=${now}.toString()),这将更改我的文件的编码,例如jsp文件。我们是否可以保留或设置文件编码?这对我很有帮助。我用expand
做了一些破坏性的事情。使用此策略仅选择我想扩展的文件
,解决了这个问题。
war {
eachFile {
if (it.name == 'yourFile.jsp') {
it.filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: [...])
}
}
}
war {
filteringCharset = 'UTF-8'
filesMatching( '**/*.jsp' ) {
filter ReplaceTokens, tokens: [
'versionDate': "${new Date().format('yyyyMMdd')}".toString(),
'copyright' : "${new Date().format('yyyy')}".toString()
]
}
}