【问题标题】:Gradle Replace text in jsp using filterGradle使用过滤器替换jsp中的文本
【发布时间】:2011-03-22 14:32:36
【问题描述】:

我有一个 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 的新手,我完全不正确吗?以前有人需要做这样的事情吗?使用 gradle 1.0-milestone-1。

谢谢

【问题讨论】:

  • 您是否与gradle -igradle -d 一起运行以获取有关您构建战争时正在发生的事情的更多信息?
  • @Emil - 感谢您的关注。我从来没有选择过这些选项,第一次尝试似乎没有做任何事情,第二次没有做我想要的,所以我没有走得更远,可能应该有。如果您想看一下,我在下面的回答确实有效。这可能不是一种非常聪明的方法,但确实可以完成工作。

标签: jsp build replace gradle


【解决方案1】:

好的,这似乎可行:

jsp页面

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

build.gradle

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

【讨论】:

  • 当我在filter(ReplaceTokens, tokens: [loginCSS: "login-min.css?t=${now}", allCSS: "all-min.css?t=${now}", allJS: "all-min.js?t=${now}"]) 中添加时间戳时,这不起作用。我得到Cause: org.codehaus.groovy.runtime.GStringImpl cannot be cast to java.lang.String
  • @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()])
  • 这将改变我的文件的编码,例如,jsp文件。无论如何我们可以保留或设置文件编码吗?
【解决方案2】:

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

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

【讨论】:

  • 这对我有帮助。我正在用 expand 做一些事情,这很糟糕。使用此策略仅选择我想要expand 的文件解决了问题。
【解决方案3】:

不确定这是否符合 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 在下面的 cmets 中指出的那样,此解决方案在运行二进制文件或具有 JSP EL 表达式的文件时会出现问题。

【讨论】:

  • 这让我失望了,因为它奇怪地尝试替换二进制文件中的令牌(在我的例子中是 favicon.ico)。它似乎也与 JSP EL 冲突...
  • 我遇到了完全相同的事情。当遇到一些 jstl 内容时,我遇到了 EOL 解析错误。它适用于这种情况,因为我正在查看一个非常特殊的文件,该文件不是二进制文件并且没有 jstl。我愿意接受另一种在所有情况下都能更好地工作的解决方案,但我还没有找到。
【解决方案4】:

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

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

【讨论】:

  • 我敢打赌,可以在 eachFile 中执行 ant.replace ,类似于我的答案中的 expand 。这可能会解决解决方案所具有的二进制和 jstl 问题。我得试试。
【解决方案5】:

你也可以设置编码方式(因为默认会改变文件编码):

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

【讨论】:

    猜你喜欢
    • 2016-07-31
    • 1970-01-01
    • 2012-07-03
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多