Gradle使用过滤器替换jsp中的文本

时间:2011-03-22 14:32:36

标签: jsp build replace gradle

我有一个jsp包含一个看起来像

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

为了防止浏览器缓存css文件,我们将login-min.css替换为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/@loginCSS@" 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: "@loginCSS@", value: "login-min.css?v=1")
      }
    }
  }
}

我是一个全新的人,我完全错误地解决了这个问题?以前有人需要这样做吗?使用gradle 1.0-milestone-1。

由于

5 个答案:

答案 0 :(得分:10)

好的,这似乎有效:

jsp页面

<link type="text/css" href="/css/@loginCSS@" rel="stylesheet" />

<强>的build.gradle

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

答案 1 :(得分:5)

尝试的另一种变体(在我的情况下,它可以克服这个错误http://issues.gradle.org/browse/GRADLE-1566#

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

答案 2 :(得分:4)

不确定这是否符合groovy / 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表达式运行二进制文件或文件时会遇到麻烦。

答案 3 :(得分:0)

我们做了类似(但不完全相同)的事情,只是创建java.io.File并操纵它们,然后使用from{}webInf{}将它们包含到.war中fileTree

你可以看一下这样的东西,但是因为这似乎很好地被蚂蚁处理了,你有没有直接从gradle like this使用ant?

答案 4 :(得分:0)

您还可以设置编码(因为默认情况下它会更改文件编码):

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