Gradle заменить текст в jsp с помощью фильтра

у меня есть jsp, который содержит ссылку css, которая выглядит как

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

чтобы браузеры не кэшировали файл css, мы заменяем login-min.css С именем css и меткой времени или номером версии

login-min.css?t=432432423423...

в 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>

для gradle я обновил страницу jsp, чтобы выглядеть как

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

и в построении.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.

спасибо

5 ответов


хорошо, это, кажется, работает:

страница jsp:

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

построить.Gradle в:

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

еще один вариант, чтобы попробовать (он работает в моем случае, чтобы преодолеть эту ошибку http://issues.gradle.org/browse/GRADLE-1566#)

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

не уверен, что это соответствует стилю 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()}")
    }
  }
}

Edit - как указывает Аксель ниже в комментариях, это решение имеет проблемы, когда оно работает с двоичными файлами или файлами с выражениями JSP EL.


мы делали похожие (но не совсем точно такие же) вещи, просто создавая java.io.Files и манипулирование ими, а затем включение их в.война с использованием from{} или webInf{} С fileTree.

вы могли бы посмотреть на что-то подобное, но поскольку это, похоже, обрабатывается довольно хорошо муравьем, вы изучили использование ant непосредственно из gradle такой?


вы также можете установить кодировку (потому что по умолчанию она изменит кодировку файла):

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