指南 -UniMax V4&V5 运行环境支持在线热部署 class 和 jsp 文件
1 概述
1.1 原理
class 文件的热部署原理同 arthas 工具,系统启动时通过 attachVM 操作获取 Instrumentation 对象,该对象的 redefineClasses 方法支持 class 文件的热部署。JSP 文件的热部署则直接替换文件即可。
注意:class 文件的热部署是内存替换,服务重启即失效。JSP 是文件替换,服务重启仍然有效。
1.2 支持的版本
理论上 jdk6 以上都支持热部署,但补丁文件的 jar 包在 1.8 下编译,当前仅支持 jdk8+ 的版本,运行容器环境为 tomcat8,jboss 和 tomcat 的其它版本未测试。
2 项目升级 (以康明斯项目为例)
2.1 引入 mestar-agent 包
直接在 pom.xml 中引入如下依赖即可。
<dependency>
<groupId>com.epichust.mestar</groupId>
<artifactId>mestar-agent</artifactId>
<version>1.0.1</version>
</dependency>
2.2 配置 web.xml
在文件中添加如下 listener 即可
<listener>
<listener-class>com.epichust.mestar.agent.MestarAgentListener</listener-class>
</listener>
2.3 配置启动参数
由于 attachVM 操作需要 jdk 中的 tools.jar 包,开发环境和运行环境都需要配置该文件路径。配置命令如下 (如果没有环境变量请写全路径):
-Xbootclasspath/a:${JAVA_HOME}/lib/tools.jar
2.3.1 开发环境配置样例
2.3.2 运行环境配置样例
2.3.3 补充说明
如果系统启动有如下提示信息,说明 tools.jar 未生效,请检查配置参数。
VirtualMachine加载失败,请在JVM启动参数增加 -Xbootclasspath/a:${JAVA_HOME}/lib/tools.jar
3 运行和使用
服务仅提供了接口,页面暂未开发。可以使用 postman 或其它类似工具完成接口调用。
3.1 系统登录
接口:/j_spring_security_check
请求类型:POST
参数类型:路径参数
参数列表:
j_usernam - 用户名
j_password - 密码
示例:
3.2 class 热部署
接口:/jvmController!redefineByFile.m
请求类型:POST
参数类型:body 参数,content-type 为 form-data
参数:
file - 编译后的 class 文件 (在 postman 中选择 KEY 右侧的类型为 file 即可在 VALUE 中上传文件)
name - class 文件的全限定名
接口调用示例:
操作视频示例:
class 热部署示例.mp4
3.3 JSP 热部署
接口:/jvmController!replaceJSP.m
请求类型:POST
参数类型:body 参数,content-type 为 form-data
参数:
filePath – JSP 的文件路径,从 content 的下级目录开发,点号分隔,不包括文件名
file – JSP 文件 (在 postman 中选择 KEY 右侧的类型为 file 即可在 VALUE 中上传文件)
filename - JSP 文件的文件名,不包括路径
接口调用示例:
操作视频示例:
jsp 热部署示例.mp4
3.4 JS 和 CSS 文件热部署
接口同 JSP 文件,差异为 filePath 是从 WEB-INF 开始的文件路径,同样点号分隔,不包含文件名
4 插件化开发
mestar-agent 还支持从 jar 包中加载 jsp 文件,用于插件化开发。该功能是通过 javassist 工具动态修改替换 tomcat 的资源查找方法实现的,目前仅在 tomcat8 环境下测试运行。以康明斯为例,项目仅需要通过 pom 配置依赖 WMS 插件的 jar 包 (uma-warehouse-xxx.jar) 即可,该 jar 包即包括 class 文件,也包括位于 content 目录下的 jsp 文件,实现了项目代码和插件代码的完全分离,如下图:
运行时,tomcat 会优先从 WEB-INF\classes\content 目录下查找 jsp 文件,如果没有找到则尝试查找 jar 包中的 jsp 文件 (会有效率损耗,目前测试人工感知不明显)。
!!!重要更新:补丁包 1.0.2 版本支持页面操作
更新步骤:
1 依赖 mestar-agent-1.0.2.jar
2 添加如下路径的系统菜单
platform!gopage.m?topage=management.hotDeployment.jsp
3 效果图: