使用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即可运行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值