Spring Boot集成Jawr遇报错:无法找到指定资源包路径
我之前也碰到过类似的问题,结合Spring Boot和Jawr的集成经验,这几个方向应该能帮你定位问题:
1. Jawr配置文件的bundle映射未正确关联静态资源
Jawr的核心是通过配置文件定义bundle的源文件路径和输出ID,如果你只在static目录放了文件但没在配置里正确映射,Jawr根本不知道要生成对应的bundle。
检查你的jawr.properties(或yaml配置),确保每个bundle的sourceFiles指向static目录里的实际文件路径,比如:
# CSS bundle配置示例 jawr.css.bundles.dependency.id=/bundles/dependency.css jawr.css.bundles.dependency.sourceFiles=classpath:/static/css/dependency.css jawr.css.bundles.app.id=/bundles/app.css jawr.css.bundles.app.sourceFiles=classpath:/static/css/app.css # JS bundle配置示例 jawr.js.bundles.ie-support.id=/bundles/ie-support.js jawr.js.bundles.ie-support.sourceFiles=classpath:/static/js/ie-support.js # 开发环境开启自动构建(修改文件后自动重新生成bundle) jawr.autobuild.on=true
注意:sourceFiles的路径要和你static目录下的文件结构完全匹配,比如如果文件在static/css/libs/dependency.css,那路径就要写成classpath:/static/css/libs/dependency.css。
2. Spring Boot的静态资源处理器拦截了Jawr的请求
Spring Boot默认会接管/路径下的静态资源请求,而Jawr需要通过自己的Servlet来处理/bundles/**的请求,否则Spring会直接去static目录找/bundles/dependency.css(这个文件当然不存在,因为bundle是Jawr生成的)。
解决方法是在Spring Boot配置类里注册Jawr的Servlet,让它专门处理bundle请求:
@Configuration public class JawrConfiguration { @Bean public ServletRegistrationBean<JawrServlet> jawrCssServlet() { ServletRegistrationBean<JawrServlet> registration = new ServletRegistrationBean<>(new JawrServlet(), "/bundles/*.css"); registration.addInitParameter("configLocation", "/jawr.properties"); registration.setName("JawrCssServlet"); return registration; } @Bean public ServletRegistrationBean<JawrServlet> jawrJsServlet() { ServletRegistrationBean<JawrServlet> registration = new ServletRegistrationBean<>(new JawrServlet(), "/bundles/*.js"); registration.addInitParameter("configLocation", "/jawr.properties"); registration.addInitParameter("type", "js"); registration.setName("JawrJsServlet"); return registration; } }
3. Freemarker模板中未使用Jawr标签引用bundle
如果你在index.ftl里直接写了普通的link/script标签,比如:
<link href="/bundles/dependency.css" rel="stylesheet">
这种方式不会触发Jawr的bundle生成逻辑,自然找不到对应的文件。必须使用Jawr提供的Freemarker标签来引用:
# 先引入Jawr标签库 <#assign jawr=JspTaglibs["http://jawr.net/tags"] /> # 引用CSS bundle <@jawr css="/bundles/dependency.css"/> <@jawr css="/bundles/app.css"/> # 引用JS bundle <@jawr js="/bundles/ie-support.js"/>
4. Jawr未正确初始化或bundle生成开关未开启
检查项目启动日志,看看有没有Jawr初始化的相关日志,如果没有,说明Jawr没有被正确加载,可能是依赖引入不全或者配置文件路径不对。
另外,开发环境要确保jawr.autobuild.on=true,这样Jawr会在启动时自动扫描源文件生成bundle;生产环境可能需要提前预编译bundle,或者开启自动构建(不推荐生产环境开启)。
5. 路径大小写不匹配
如果你的部署环境是Linux/Mac,要注意文件路径是区分大小写的。比如配置里写的是dependency.css,但实际文件是Dependency.css,这种情况下Jawr找不到源文件,自然生成不了bundle。
内容的提问来源于stack exchange,提问作者Sahil Verma

