对于运维人员来说,热部署是常常要思考的一个问题。热部署简单来说,就是局部或者某个文件修改后,不用重新启动程序,立即生效。

好处在于在程序初始化的时候可能会加载大量的初始化数据,重启程序成本太高;程序如果是项目中的单个模块,重启会影响别的应用。

对于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



Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐