9

我有一个jsp,其中包含一个看起来像的css链接

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

为了防止浏览器缓存 css 文件,我们用 csslogin-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/@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 的新手,我完全不正确吗?以前有人需要做这样的事情吗?使用 gradle 1.0-milestone-1。

谢谢

4

5 回答 5

10

好的,这似乎有效:

jsp页面

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

构建.gradle

war {
   filter(ReplaceTokens, tokens: ['loginCSS': 'login-min.css'])
}
于 2011-03-25T16:48:52.450 回答
5

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

war {   
   eachFile {
      if (it.name == 'yourFile.jsp') {
        it.filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: [...])
      }
   }
}
于 2011-09-26T08:33:47.697 回答
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 表达式的文件运行时会出现问题。

于 2011-03-23T02:33:09.113 回答
0

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

您可以研究类似的东西,但是由于 ant 似乎可以很好地处理这件事,您是否考虑过像这样直接从 gradle 使用 ant ?

于 2011-03-23T16:58:48.723 回答
0

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

war {
    filteringCharset = 'UTF-8'
    filesMatching( '**/*.jsp' ) {
        filter ReplaceTokens, tokens: [
                'versionDate': "${new Date().format('yyyyMMdd')}".toString(),
                'copyright'  : "${new Date().format('yyyy')}".toString()
        ]
    }
}
于 2017-12-05T15:45:29.557 回答