我正在使用
的GRAILS 3.1.0应用程序上使用bootstrapcompile 'org.webjars:bootstrap:3.3.6'
当我运行应用程序时,dev和prod都来自grails ...
grails prod run-app
grails dev run-app
...所有工作属性,包括bootstap组件和glyphicons,但是当我把战争放在Tomcat上时,没有显示glyphicons,但是bootstrap组件可以正常工作。
我在使用表单
的痕迹上看到了一些错误No mapping found for HTTP request with URI [/helloworldapplication/fonts/glyphicons-halflings-regular.ttf] in DispatcherServlet with name 'grailsDispatcherServlet'
可以在文件夹
中的Tomcat上找到这些文件webapps\helloworldapplication\assets\webjars\bootstrap\3.3.6\fonts
这发生在Grails 3.1.0和3.1.1
中答案 0 :(得分:0)
昨天我遇到了同样的麻烦。我试图在战争包装阶段在正确的地方复制 fonts ,但它没有用。 我通过将请求重定向到正确的路径来解决这个问题。为此,首先,我创建了一个拦截器来捕获请求并重定向它:
class BootstrapInterceptor {
int order = HIGHEST_PRECEDENCE
String bootstrapVersion = null
public BootstrapInterceptor() {
match(uri: "/fonts/**")
}
boolean before() {
if(bootstrapVersion == null) {
setBootstrapVersion(request)
}
def to = "/assets/webjars/bootstrap/${bootstrapVersion}${request.getRequestURI()}"
log.debug("Redirect: ${request.getRequestURI()} to: $to")
redirect(uri: to)
false
}
boolean after() { true }
void afterView() {
// no-op
}
private void setBootstrapVersion(def request) {
def path = request.getServletContext().getRealPath("/")
def bootstrapSubFolders = new File("${path}assets/webjars/bootstrap/").listFiles()
if (bootstrapSubFolders?.length == 1) {
bootstrapVersion = bootstrapSubFolders[0].name
log.debug("Bootstrap version detected: $bootstrapVersion")
}
else if (bootstrapSubFolders?.length > 1) {
bootstrapVersion = bootstrapSubFolders[0].name
log.warn("Multiple versions of bootstrap detected, taking $bootstrapVersion")
}
else {
log.warn("Unable to catch the bootstrap version")
bootstrapVersion = ""
}
}
}
您需要告诉Grails允许 / fonts / whatever 之类的请求。没有它,拦截器就不会被召唤。所以,小技巧是将该行放在 UrlMappings :
上"/fonts/**"(redirect: '/intercepted/by/bootstrap/interceptor')
它应该工作(使用你的tomcat和没有,即使你升级你的bootstrap版本!)。 使用该方法,您不应该在webapp中包含 fonts 文件夹(因为它将被重定向到bootstrap fonts文件夹)。
希望它可以帮到你;)
PS:如果你不想把它作为拦截器,你可以改变你的tomcat url映射来做同样的事情。
答案 1 :(得分:0)
这是因为资产管道,插件管理资源本身,所以它也有助于遵循惯例。 似乎你有bootstrap文件夹里面的fonts文件夹,在你的应用程序上创建assets文件夹里面的fonts文件夹,其余应该自己工作。
答案 2 :(得分:0)
我将glyphicon字体文件放在/ grails-app / assets / fonts /中。然后,从here,我做了这个:
将fonts目录与样式表,图像和javascript平行 进入grails-app / assets /文件夹。为资产管道知道 新目录,在build.gradle文件中指定它:
assets { minifyJs = true minifyCss = true includes = ["fonts/*"] }
然后,似乎我还必须在字形图标出现之前做grails clean
。