使用ANT動態更新重啟JAVA服務
阿新 • • 發佈:2018-12-17
廢話少說,功能如下 :
- 動態從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即可執行