廢話少說,功能如下 :
- 動態從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即可運行