使用ANT动态更新重启JAVA服务
废话少说,功能如下 :
- 动态从SVN更新WEB项目代码,编译后发布到tomcat目录下
- 重启tomcat服务
整个操作都在网页上一键完成,实现代码的动态部署。
- 首先需要的就是下载ANT,并配置ANT环境变量。
ANT_HOME |
D:\Runtime\apache-ant-1.9.13 |
JAVA_HOME |
D:\Runtime\jdk1.8.0_162 |
CLASS_PATH |
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%ANT_HOME%\lib; |
PATH |
%JAVA_HOME%\bin;%ANT_HOME%\bin; |
- 其次去网上下载svnkit的jar包,用于ant调用SVN命令。将SVN-KIT包放在ANT的lib目录下面。
- 然后就是编写ANT脚本了。ANT脚本分五步:更新SVN代码,编译,发布,关闭TOMCAT,重启TOMCAT。
<?xml version="1.0" encoding="GBK"?> <project basedir="D:\code\project" name="project" default="all-in-one"> <!-- 环境配置要求: 1.配置ANT_HOME环境变量 2.JAVA安装目录不能用存在空格(如Program Files目录下) 3.删除TOMCAT/bin/catalina.bat文件中set JSSE_OPTS=-Djdk.tls.ephemeralDHKeySize=2048中的引号 --> <!-- 构建相关属性 --> <property name="dir.class" value="${dir.base}\WEB-INF\classes"/> <property name="dir.src" value="${basedir}\src"/> <property name="dir.resources" value="${basedir}\resources"/> <property name="dir.web" value="${basedir}\web"/> <property name="dir.lib" value="${dir.web}\WEB-INF\lib"/> <property name="dir.ant" value="D:\Runtime\apache-ant-1.9.13\lib"/> <property name="tomcat.home" value="D:\Runtime\apache-tomcat-8.5.31"/> <property name="java.home" value="D:\Runtime\Java\jdk1.8.0_162"/> <property name="dir.base" value="${tomcat.home}\webapps"/> <!-- SVN相关属性 --> <property name="svn.repository" value="http://192.168.1.90:9000/svn/project"/> <property name="svn.username" value="guoyh" /> <property name="svn.password" value="guoyh0306" /> <!-- 应用lib定义 --> <path id="web.lib"> <fileset dir="${dir.lib}"> <include name="**/*.jar"/> </fileset> </path> <!-- SVNKit相关包lib --> <path id="ant.lib"> <fileset dir="${dir.ant}"> <include name="**/*.jar"/> </fileset> </path> <path id="tomcat.path"> <fileset dir="${tomcat.home}/bin"> <include name="bootstrap.jar"/> <include name="tomcat-juli.jar"/> </fileset> </path> <!-- SVN更新项目代码 --> <target name="1-svnUpdate"> <echo message="更新SVN代码"/> <java classname="org.tmatesoft.svn.cli.SVN" dir="${basedir}" fork="true"> <arg value="update"/> <arg value="--username"/> <arg value="${svn.username}"/> <arg value="--password"/> <arg value="${svn.password}"/> <arg value="${basedir}"/> <classpath refid="ant.lib" /> </java> </target> <!-- 编译构建项目 --> <target name="2-build"> <echo message="编译Java文件"/> <mkdir dir="${dir.class}"/> <javac destdir="${dir.class}" srcdir="${dir.src}" fork="true" target="1.8" excludes="**/.svn/**"> <classpath refid="web.lib"/> <classpath refid="ant.lib"/> <compilerarg line="-encoding UTF-8 "/> <compilerarg value="-g:lines,vars,source" /> </javac> <echo message="更新class文件到服务器"/> <copy todir="${dir.class}" preservelastmodified="true"> <fileset dir="${dir.src}"> <include name="**/*.properties"/> <include name="**/*.xml"/> </fileset> </copy> </target> <target name="3-deploy"> <echo message="更新其它文件到服务器"/> <copy todir="${dir.base}" preservelastmodified="true"> <fileset dir="${dir.web}"> <include name="**/**"/> </fileset> </copy> <copy todir="${dir.class}" preservelastmodified="true"> <fileset dir="${dir.resources}"> <exclude name="**/*.properties"/> <include name="**/*.xml"/> </fileset> </copy> </target> <target name="4-stop_tomcat"> <echo>关闭tomcat</echo> <exec executable="cmd" dir="${tomcat.home}/bin" failonerror="false" append="true" > <!-- <arg value="/c" /> --> <env key="CATALINA_HOME" path="${tomcat.home}"/> <env key="JAVA_HOME" path="${java.home}"/> <arg value="/c shutdown.bat" /> </exec> </target> <target name="5-start_tomcat"> <echo>启动tomcat</echo> <exec executable="cmd" dir="${tomcat.home}/bin" failonerror="false" append="true" > <!-- <arg value="/c" /> --> <env key="CATALINA_HOME" path="${tomcat.home}"/> <env key="JAVA_HOME" path="${java.home}"/> <env key="title" path="整体估价系统"/> <arg value="/c startup.bat" /> </exec> </target> <target name="all-in-one" depends="1-svnUpdate,2-build,3-deploy,4-stop_tomcat,5-start_tomcat"> <echo message="执行代码更新并发布到服务器.."/> </target> </project>
正如文档所说,JAVA不能安装在包含空格的目录下面。而且TOMCAT/bin/catalina.bat文件中set JSSE_OPTS=-Djdk.tls.ephemeralDHKeySize=2048的引号要删除,否则不能通过WEB项目调用。
做完以上动作基本上就可以运行了。现在写JAVA部分的代码
@RequestMapping(value = "/deployRun", method = RequestMethod.POST)
@ResponseBody
public ResultBean deployRun(HttpServletRequest request) {
ResultBean resultBean = new ResultBean();
String filepath = request.getSession().getServletContext().getRealPath("/");
File buildFile = new File(filepath+"/build.xml"); //加载build配置文件
if(!buildFile.exists()){
resultBean.setMsg("未找到配置文件build.xml,请联系供应商");
return resultBean;
}
// 创建一个ANT项目
Project p = new Project();
// 创建一个默认的监听器,监听项目构建过程中的日志操作
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
try {
p.fireBuildStarted();
// 初始化该项目
p.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
// 解析项目的构建文件
helper.parse(p, buildFile);
// 执行项目的某一个目标
p.executeTarget("all-in-one");
p.fireBuildFinished(null);
} catch (BuildException be) {
p.fireBuildFinished(be);
} catch (InterruptedException e) {
e.printStackTrace();
}
resultBean.setCode(Constants.SUCCESS);
return resultBean;
}
其中ResultBean只是一个简单的对象,内容如下:
private String msg = "";
private int code = FAILURE;
private Object data;
- 执行 http://localhost:8080//deployRun即可运行