我有一个用弹簧启动制成的实用程序,将捆绑的雄猫打包到可执行的jar中。我需要的是将一些 JS(或可能是 JSON)文件与 JAR 文件放在同一个文件夹中,并能够将它们插入到 Thymeleaf 模板中。例如
<script type="text/javascript" src="somepath/myfile.js"></script>
到目前为止,我已经设法做到了这一点:在控制器中:
String userDir = System.getProperty("user.dir");
model.addAttribute("userDir", "file://"+userDir+"/");
在模板中:
<script type="text/javascript" th:src="${userDir + 'myfile.js'}"></script>
目前,我能够通过Firebug html视图查看myfile中的代码.js但不是在"脚本"选项卡中,也没有执行脚本(此文件中定义的任何变量都是未定义的)。
怎么办?
我知道我可以创建一个 json 文件并通过 java 处理它,但是如果我正在寻找的解决方案存在,它对我来说使用起来更简单、更方便,而且这样我就可以使用自定义 js,而不仅仅是 json。
我也知道这在许多情况下是非常不安全的,但在这种情况下,无论想要通过文件注入什么,应用程序都不必是安全的。
您可以自定义 WebMvcConfigurationAdapter 以将一些文件系统文件夹添加到资源注册表。
@Configuration
public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Value("${resources}")
private String resources;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (resources != null) {
registry.addResourceHandler("/myresources/**").addResourceLocations("file:" + resources);
}
super.addResourceHandlers(registry);
}
}
然后在执行 JAR 时提供 --resources 参数。请注意尾随/
java -jar your_jar_file --resources=/path/to/resources/
另请注意,此路径中的资源是针对 /myresources/ 路径注册的,因此您需要按如下方式修改模板
<script type="text/javascript" src="myresources/myfile.js"></script>
myfile.js 应该出现在 --resources 参数中提到的路径中
更新#1(我还没有测试过,但你可以试试)
刚刚发现 spring boot 支持自定义静态位置的属性
请参阅弹簧通用属性附录
您需要在 application.properties 中定义的属性如下
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
将您的位置附加到其中。您也可以像使用文件资源一样
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:/tmp/resources