Tomcat/Spring boot 重载 META-INF/resources/jsp 文件(实时更新)

Posted

技术标签:

【中文标题】Tomcat/Spring boot 重载 META-INF/resources/jsp 文件(实时更新)【英文标题】:Tomcat/Spring boot reloading META-INF/resources/ jsp files (live updates) 【发布时间】:2017-05-26 15:29:10 【问题描述】:

我在 spring boot/tomcat 实例中使用 jsp 时遇到问题。 基本上,我在模块 A (A/src/main/resources/META-INF/resources/jsp) 中有所有 jsp 文件,并且该模块作为 jar 依赖项包含在模块 B(主模块,war 包装)中。问题是,当应用程序在调试模式下运行时(在 Eclipse 或 IntelliJ Idea 中),位于模块 A 中的所有 jsp 文件都不会自动重新加载(在呈现的网页上看不到文件的更改),只能重新启动的 tomcat 实际上会重新加载文件并显示更改。模块 B 中被覆盖的 jsp 文件正在自己重新加载,只是模块 A 中的 jsp 文件有问题(可能是因为 META-INF/resources 文件夹)。

Module A结构(依赖,打包为jar): src/main/resources/META-INF/resources/jsp/*.jsp

Module B结构(主模块,打包成war,这里的jsp覆盖Module A中的): src/main/webapp/jsp/*.jsp

我已经寻找解决方案,但最接近答案的是这个(使用 JRebel): https://zeroturnaround.com/forums/topic/jsps-in-servlet-3-0-jars-are-not-reloading/

另外,这是我如何设置 jsp 的示例:https://github.com/ghillert/spring-boot-jsp-demo

【问题讨论】:

你试过清理tomcat工作文件夹了吗?理论上您可以强制 IDE 执行保存任务,例如 on.jsp file save clean/delete work directory。 是的,还是没有运气。 看看tomcat.apache.org/tomcat-8.0-doc/config/resources.html 好像可以完全禁用资源缓存。 您是在使用 Spring Boot 嵌入式 Tomcat 还是使用独立 Tomcat 时遇到问题? @davidxxx 问题出在他们两个身上。 【参考方案1】:

这很可能与:https://***.com/a/8656527/696632

类路径中的所有资源都受缓存的约束。你应该评估答案。

【讨论】:

不一样,但非常接近我的答案。我可能会尝试清除该答案中建议的地图,看看它是否真的会重新加载文件。【参考方案2】:

我不知道它是否符合您的限制,但有这样的解决方案: https://spring.io/blog/2015/06/17/devtools-in-spring-boot-1-3

另一个选项:https://github.com/spring-projects/spring-loaded

我使用 JSF 和 Facelets,对于具有动态渲染的 Web 技术来说,热重载总是有点问题。因此,除了 spring-boot-devtools 之外,我的建议是将静态内容开发过程与渲染相关过程分开。如果您只需要对 css、html、js 编辑进行热重载,那么大多数技术都会对您有所帮助,但渲染相关的组件编辑会要求您不时重新构建重新部署您的应用程序。他们询问您的频率取决于您将使用的工具的质量。

【讨论】:

我需要对所有文件(js、css、jsf)和 js/css 进行热重载,只需要 jar 中的 jsf 文件(src/main/resources/META-INF/resources/jsp /* 有问题。如果 jsf 文件位于 WEB-INF 文件夹中的主项目中(我使用 spring boot 运行而不是在依赖 jar 中),它可以工作,只是不在 META-INF 文件夹中依赖jar。 你看过 spring-boot-devtools 了吗? 是的,devtools 也不会重新加载这些文件。 这很奇怪,如果我根据文档正确理解它应该重新启动。正如@Babi 所说,它似乎与“资源缓存”相关。但另一方面,缓存在重启后不存在,所以 idk。 是的,我认为它也可以,但没有运气。看起来 META-INF 中的 jsf 文件在重新加载时会被忽略...【参考方案3】:

可以选择使用Gradle Cargo Plugin 或Maven Cargo plugin 将文件重新部署到Tomcat(所有文件都可以重新部署,包括资源文件)。

文件重新加载不是自动的。您必须手动运行相关的任务/目标、CargoRedeployLocal 或 cargo:redeploy 分别用于 Gradle 和 Maven 构建。

如果重新启动一切需要很长时间,使用 Cargo 插件重新部署可能有助于加快速度。

【讨论】:

以上是关于Tomcat/Spring boot 重载 META-INF/resources/jsp 文件(实时更新)的主要内容,如果未能解决你的问题,请参考以下文章

tomcat7 spring boot应用程序中的websockets

Https系列之二:https的SSL证书在服务器端的部署,基于tomcat,spring boot

Https系列之二:https的SSL证书在服务器端的部署,基于tomcat,spring boot

Https系列之二:https的SSL证书在服务器端的部署,基于tomcat,spring boot

spring boot 2

Spring Boot 实现通用 Auth 认证的 4 种方式