GRAILS 3.1.0未显示Bootstrap glyphicons

时间:2016-02-09 21:35:30

标签: twitter-bootstrap tomcat grails

我正在使用

的GRAILS 3.1.0应用程序上使用bootstrap
compile '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

3 个答案:

答案 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