1. 程式人生 > >使用ANT動態更新重啟JAVA服務

使用ANT動態更新重啟JAVA服務

廢話少說,功能如下 :

  1. 動態從SVN更新WEB專案程式碼,編譯後釋出到tomcat目錄下
  2. 重啟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即可執行