对于运维人员来说,热部署是常常要思考的一个问题。热部署简单来说,就是局部或者某个文件修改后,不用重新启动程序,立即生效。
好处在于在程序初始化的时候可能会加载大量的初始化数据,重启程序成本太高;程序如果是项目中的单个模块,重启会影响别的应用。
对于web程序来说,大多是部署在Servlet容器里面,如jBoss,weblogic,tomcat等,这些容器往往提供了配套的热部署方案。
但对于application程序,往往没有厂家单独来做这件事情。
经过本人的搜索,发现springload是一个较好的解决方案。简单测试如下。
1、下载SpringLoad jar包:
spring-loaded(https://github.com/spring-projects/spring-loaded)
maven依赖:(可不配置)
<dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.3.RELEASE</version> </dependency>
2、在项目根目录下创建repo目录,将springloaded-1.2.3.RELEASE.jar放到下面。
3、如果是eclipse,就在主类的run configuration里面添加JVM启动参数:
-javaagent:repo/springloaded-1.2.3.RELEASE.jar -noverify
注意路径。
如果是在eclipse里面,记得勾选自动编译。 Project Automatically。
启动后,修改java代码,将会立即生效。
4、对于运维来说,很多工具就不能用了,比如eclipse,热部署就没那么容易了。
如果使用maven管理,可以配置环境变量:
MAVEN_OPTS
-javaagent:repo/springloaded-1.2.3.RELEASE.jar -noverify
或者在%MAVA-HOME%/bin/mvn.bat下添加maven启动参数:
set MAVEN_OPTS=-javaagent:repo/springloaded-1.2.3.RELEASE.jar -noverify
注意路径是项目的根目录。
交给springload来启动项目。
如果修改了某个java类,怎么立即生效呢?
编译该文件到指定的目录下。如把xxx.java 编译到dir目录。
javac -d dir xxx.java
如我当前的目录:
javac -d target\mvnproject-1.0-SNAPSHOT\WEB-INF\classes src\main\java\com\mobile263\Calcutor.java
注意-d后面不要再加上类的package目录。
贴出源码:
package com.mobile263; public class Calcutor { public static int calc(int a,int b){ return a*b; } }
package com.mobile263; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class Console { public static void main(String[] args) { Timer timer = new Timer(); TimerTask task = new TimerTask() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); @Override public void run() { int res = Calcutor.calc(4, 5); System.out.println("Exec Main Class OK! Result="+res +" @"+sdf.format(new Date())); } }; timer.schedule(task, 1000, 1000); } }
在CMD命令行进入项目根目录,执行maven命令:
mvn exec:java -Dexec.mainClass="com.mobile263.Console"
修改后运行的结果:
Exec Main Class OK! Result=9 @2015-05-20 11:10:57 Exec Main Class OK! Result=9 @2015-05-20 11:10:58 Exec Main Class OK! Result=9 @2015-05-20 11:10:59 Exec Main Class OK! Result=9 @2015-05-20 11:11:00 Exec Main Class OK! Result=9 @2015-05-20 11:11:01 Exec Main Class OK! Result=9 @2015-05-20 11:11:02 Exec Main Class OK! Result=20 @2015-05-20 11:11:03 Exec Main Class OK! Result=20 @2015-05-20 11:11:04 Exec Main Class OK! Result=20 @2015-05-20 11:11:05 Exec Main Class OK! Result=20 @2015-05-20 11:11:06 Exec Main Class OK! Result=20 @2015-05-20 11:11:07 Exec Main Class OK! Result=20 @2015-05-20 11:11:08 Exec Main Class OK! Result=20 @2015-05-20 11:11:09 Exec Main Class OK! Result=20 @2015-05-20 11:11:10 Exec Main Class OK! Result=20 @2015-05-20 11:11:11
时间: 2024-11-05 12:28:08