最近很多小伙伴反馈Github文档HotSecondsIDEA上的安装教程看完之后还是不知道怎么安装,甚至有些同学不知道怎么添加jvm参数,也不知道怎么看是否启动,Github文档的确默认是有两年工作经验左右的同学,这里出一份萌新级别的教程,如果看完之后还不懂可以留言。
1. 本地热部署
这里以Java8安装为例子,简单介绍一下Java8是怎么安装的,Java11和Java17比这个还要简单。
1.1 本地热部署服务端安装
首先下载HotSecondsServer.zip解压到本地,随便哪个目录都行,我这里放到工程目录下
打开hot-seconds-remote.xml,可以看到secret,remote_port和classloader配置,分别表示密钥,启动端口和应用程序所需要的classloader。
字段 | 解释 |
---|---|
secret | 这个随便填就行,客户端用这个secret和服务端连接 |
remote_port | 服务端启动端口,这个端口专门用于热部署通信,不要和其他端口共用,千万不要用什么8080,80端口,建议保留2023端口即可 |
classloader | 本地main函数启动的都默认AppClassLoader即可,SpringBoot本地也用AppClassLoader,如果是Tomcat7用WebappClassLoader,Tomcat8及以上用ParallelWebappClassLoader |
然后上dcevm下载JDK对应版本的补丁,看看自己的JDK版本,和补丁要求的版本保持一致,建议用JDK1.8.0_181,如果你的JDK版本高于这个版本建议再装一个,Oracle JDK和OpenJDK都可以。
下载下来之后,运行这个jar进行安装,选择你的jdk版本,然后再选择Install DCEVM as altjvm

安装完之后,输入java -XXaltjvm=dcevm -version
,得到下图结果说明是安装成功了

然后在你的应用程序选择Edit Configurations
然后按图所示,添加jvm参数

以下jvm参数仅供参考,HotSecondsServer.jar和hot-seconds-remote.xml的路径可以填绝对路径和相对路径
ini
-XXaltjvm=dcevm -javaagent:./HotSecondsServer/HotSecondsServer.jar=hotconf=./HotSecondsServer/hot-seconds-remote.xml
最后点击Run或者Debug启动你的应用程序,启动程序后看看上面配置的remote_port是否起来了。
1.2 客户端配置
插件商城搜索HotSecondsClient并安装

可以看到Debug右边多了三个图标
点最右边的配置图标,不习惯英文的同学可以先换成中文
打开配置框,按下图配置
如果有用到mybatis的同学可以配置一个xml,本地路径和远程路径都填一样的,$rootPath$
是个变量,表示当前工程的根目录,也可以填绝对路径。
填完后,点击小人头像,连接刚刚启动的服务端

然后就可以在java文件上右键,或者在配置文件上右键(在上面配置的路径映射下的文件),选择热部署此文件到远程,进行热部署了。上面有个远程编译并热部署,对于本地热部署来说没有多大区别,用一下试试就知道了。
点击中间的云同步图标,可以批量热部署修改过的文件

2. Linux 远程热部署
2.1 服务端安装
下载HotSecondsServer.zip到本地解压,然后去libjvm.so找对应的jdk版本下载完后无需改名直接放到解压后目录的./lib下,然后上传到服务器某个目录(记目录为$path1),在服务器上执行sh install.sh
如果成功了,输入java -XXaltjvm=dcevm -version
会得到下图的效果

将hot-seconds-remote.xml复制到代码的resource目录(随便找个目录都行),后续hot-seconds-remote.xml会部署到服务器上,假设服务器上hot-seconds-remote.xml所在的目录为$path2),根据需要修改配置
字段 | 解释 |
---|---|
secret | 这个随便填就行,客户端用这个secret和服务端连接 |
remote_port | 服务端启动端口,这个端口专门用于热部署通信,不要和其他端口共用,千万不要用什么8080,80端口,建议保留2023端口即可 |
classloader | 普通项目填AppClassLoader即可,SpringBoot用LaunchedURLClassLoader,Tomcat7用WebappClassLoader,Tomcat8及以上用ParallelWebappClassLoader |
然后添加jvm参数
ini
-XXaltjvm=dcevm -javaagent:$path1/HotSecondsServer.jar=hotconf=$path2/hot-seconds-remote.xml
这个jvm参数一般是在你的代码的配置文件能配置的,记住jvm参数不是main函数的args,和-Xms -Xmx一样都是属于jvm启动前就需要配置的jvm属性,另外如果有-server参数的,一定要把这个jvm参数放到-server的后面
,比如 java -server -XXaltjvm...。
这里面$path1
和$path2
都是刚才提到的目录。
一个完整的例子:
bash
java -XXaltjvm=dcevm -javaagent:/tmp/HotSecondsServer.jar=hotconf/tmp/hot-seconds-remote.xml -jar SpringBootMain.jar
一定要放到-jar之前才叫jvm参数,不能放到-jar之后
然后部署你的项目到Linux服务器上,一般每个公司都有自己的部署平台,部署完之后,刚才加的jvm参数会加载HotSecondsServer.jar,启动后可以用 lsof -i:2023
看看端口是否启动,这里的2023替换为你在hot-seconds-remote.xml中配置的remote_port,如果有这个端口说明启动成功。
如果端口没启动怎么办
- 没有加jvm参数 : -XXaltjvm=dcevm -javaagent...
- 服务器启动失败,看报错日志,比如端口被占用等原因
2.2 客户端安装
IDEA插件商城搜索HotSecondsClient并安装

可以看到Debug右边多了三个图标
点最右边的配置图标,不习惯英文的同学可以先换成中文
打开配置框,按下图配置

如果是class则无需配置,有用到mybatis的同学可以配置一个xml,本地路径$rootPath$
是个变量,表示当前工程的根目录,也可以填绝对路径,远程路径一定要填绝对路径,表示上传到哪个目录,这个远程目录随意写。
填完后,点击小人头像,连接远程服务端

然后就可以在java文件上右键,或者在配置文件上右键(在上面配置的路径映射下的文件),选择热部署此文件到远程,就可以热部署了。上面有个远程编译并热部署,这个是在服务端编译并热部署的。
点击中间的云同步图标,可以批量热部署修改过的文件

如果连接远程服务器失败怎么办
- 先看上文
如果端口没启动怎么办
,确保服务端端口已经起来了 - 连接服务器失败报错,但是报错提示的ip和配置的远程ip并不一致,比如远程ip为
10.127.11.111
,但是报错ip为127.0.0.1
,这个原因是服务器的host配置问题,输入hostname -i
可以看到配置的host,这个问题的解决方案是,在服务端加上jvm参数-Djava.rmi.server.hostname=远程ip
- 报错non-JRMP server at remote endpoint,配置里面的remote_port和其他端口共用了,remote_port必须是一个独立的端口仅用于热部署,不要和其他端口共用,可以换个端口试试