指南 -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 开发环境配置样例

image.png

 

2.3.2 运行环境配置样例

image.png

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 - 密码

示例:

image.png

 

3.2 class 热部署

接口:/jvmController!redefineByFile.m

请求类型:POST

参数类型:body 参数,content-type 为 form-data

参数:

file - 编译后的 class 文件 (在 postman 中选择 KEY 右侧的类型为 file 即可在 VALUE 中上传文件)

name - class 文件的全限定名

接口调用示例:

image.png

操作视频示例:
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 文件的文件名,不包括路径

接口调用示例:

image.png

操作视频示例:
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 文件,实现了项目代码和插件代码的完全分离,如下图:

image.png

运行时,tomcat 会优先从 WEB-INF\classes\content 目录下查找 jsp 文件,如果没有找到则尝试查找 jar 包中的 jsp 文件 (会有效率损耗,目前测试人工感知不明显)。