Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用过滤器渐变替换jsp中的文本_Jsp_Build_Replace_Gradle - Fatal编程技术网

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

使用过滤器渐变替换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

我有一个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 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()
        ]
    }
}