用ant进行快速开发

基于ANT+通讯协议软件开发环境搭建 这里讲讲基于ANT+通讯协议软件开发环境搭建。 阅读详情

        敏捷开发的一个基础就是使用自动化的构建过程,而这又是依赖于构建脚本工具的。ant是一个基于java的优秀的构建工具,我相信网上关于ant的介绍是铺天盖地,而ant的使用方法最好就是看ant的手册,这里我想将的是ant的实际用途,千万不要为了用ant而用ant,工具的作用在于提高你的效率。
        首先是这样一个场景,在我去年用eclipse开发web application的时候,wtp还没有成熟,一直用lomboz,lomboz也是个不错的插件,但问题在于,在快速开发方面没有什么支持?什么是快速开发?我的理解是,所谓快速开发,是要保证开发人员对于开发环境和部署环境的区别是透明的,说的通俗点,我一旦改好代码,希望按个按钮就能把改好的程序跑起来马上测试一下(这方面wtp做的非常棒),但是对于web application跑一个用需要一个部署过程,还要起tomcat这里的容器。也就是说,我一旦改好代码,想测试一下的话,要做这么几件事情,首先进入开发的目录,然后确保是一个正确的web application的目录结构(这一点lomboz已经帮你做好了),然后把整个目录部署在容器中(其实可以修改容器的配置文件,把应用的位置指向开发环境,但是当时我还是小白,不知道可以这样,而且这会打乱容器的正常部署),最后启动容器。
        简直是太麻烦了!于是网上找了个tomcat的插件,这样就可以在eclipse中点击一下按钮,就把容器起来了,不用到控制台打命令。但这仅仅解决了最后一步,上面怎么办?
        用ant解决!写一个部署脚本,完成上面的步骤:
       <project name="deploy" default="all" basedir="." >
<property name="dest.dir" value="C:/Program Files/Apache Software Foundation/Tomcat 5.5

/webapps/AjaxSamples"></property>
<property name="class.dir" value="build/classes"></property>
<target name="copyClass">
    <copy todir="${dest.dir}/WEB-INF/classes">
        <fileset dir="${class.dir}">
            <include name="**/*"/>
        </fileset>
    </copy>
</target>
<target name="copyOther">
    <copy todir="${dest.dir}">
        <fileset dir="WebContent">
            <include name="**/*"/>
        </fileset>
    </copy>
</target>
<target name="all" depends="copyClass,copyOther">
</target>
</project>
         这个project有两个target,第一个是部署class字节码文件,第二个是部署其他文件。分成两个的原因是因为在开发环境,字节码文件有另外的输出目录。dest.dir是tomcat的部署目录,class.dir是开发环境字节码的输出目录,这样一旦改完代码,只需要做两件事情,第一,运行一下脚本,第二,启动tomcat,然后就能直接在浏览器测试了。而且tomcat支持热插拔,甚至不用重启tomcat,只要运行脚本即可。
        上述这个例子比较简单,而且似乎和敏捷开发没什么帮助,下面给个稍微复杂的例子,在开源社区有许多帮助完成持续集成(continous integration)的工具,比如cruisecontrol,luntbuild等,这些构建的运行是基于用户自己的构建脚本的。下面我就举个这样的ant脚本的例子。写分析一下持续集成应该做哪些任务。第一,从cvs上下载源码,第二编译源码,第三编译测试代码,第四运行测试案例(junit),第五输出测试报告,第六部署报告。这里我要加一个步骤,持续集成经常要查看一些进一步的测试情况,这里假定我们会用emma这个优秀的分析代码覆盖率的工具,所以我要加的步骤就是在编译完源码之后需要往源码的字节码注入emma内容的一个target,和最后输出并部署emma报告的target并在原来的做 junit的target中加入emma的jvm参数。下面是整个脚本:
 <project name="buildWithEmma" default="execute">
    <target name="init">
        <property name="src.dir" value="src"></property>   
        <property name="class.dir" value="bin"></property>       
        <property name="testsrc.dir" value="test"></property>
        <property name="testclass.dir" value="testBin"></property>
        <property name="lib.dir" value="lib"></property>
        <property name="reports.dir" value="reports"></property>
        <property name="junitReport.dir" value="${reports.dir}/junit"></property>

        <property name="bin.instr.dir" value="instrBin"></property>
        <property name="coverage.dir" value="coverage"></property>
        <property name="emma.enabled" value="true"></property>

        </property>
        <path id="class.main.lib">
            <pathelement location="${class.dir}"/>
            <fileset dir="${lib.dir}">
                <include name="**/*.jar"/>
            </fileset>
        </path>
        <path id="class.src">
            <pathelement location="${class.dir}"/>
        </path>
        <path id ="emma.lib">
            <pathelement location="${lib.dir}/emma.jar"/>
            <pathelement location="${lib.dir}/emma_ant.jar"/>
        </path>
        <taskdef resource="emma_ant.properties" classpathref="emma.lib" />
    </target>

   
    <target name="compileSrc" depends="init">
        <delete dir="${class.dir}"></delete>
        <mkdir dir="${class.dir}"> </mkdir>
        <javac srcdir="${src.dir}"
               destdir="${class.dir}"
               debug="on"
        >
        <classpath refid="class.main.lib"/>
        </javac>
        <copy todir="${class.dir}">
            <fileset dir="${src.dir}">
                <exclude name="**/*.java" />
            </fileset>
        </copy>
    </target>
    <target name="compileTest" depends="init">
        <delete dir="${testclass.dir}"></delete>
        <mkdir dir="${testclass.dir}"/>
        <javac srcdir="${testsrc.dir}"
               destdir="${testclass.dir}"
               debug="on"
        >
        <classpath refid="class.main.lib" />

        </javac>
        <copy todir="${class.dir}">
            <fileset dir="${src.dir}">
                <exclude name="**/*.java" />
            </fileset>
        </copy>
    </target>
    <target name="instrument" depends="compileSrc">
        <delete dir="${bin.instr.dir}"></delete>
        <delete dir="${coverage.dir}"></delete>
        <mkdir dir="${bin.instr.dir}" />
                <mkdir dir="${coverage.dir}" />
                <emma enabled="${emma.enabled}">
                    <instr instrpathref="class.src"
                        destdir="${bin.instr.dir}"
                        metadatafile="${coverage.dir}/metadata.emma"
                        merge="true">
                    </instr>
                </emma>
                <copy todir="${bin.instr.dir}">
                    <fileset dir="${class.dir}">
                        <exclude name="**/*.java" />
                    </fileset>
                </copy>
    </target>

    <target name="test" depends="compileTest">
        <delete dir="${junitReport.dir}" failonerror="false"/>
        <mkdir dir="${junitReport.dir}"/>
        <junit fork="true" forkmode="once" printsummary="withOutAndErr"

errorproperty="test.error" showoutput="on">


            <!--Refer to metadata.emma to collect run information-->
            <jvmarg value="-Demma.coverage.out.file=${coverage.dir}/coverage.emma"/>
            <jvmarg value="-Demma.coverage.out.merge=false" />
            <!--Test support package-->
            <classpath location="${bin.instr.dir}" />

            <classpath location="${testclass.dir}" />

            <classpath refid="emma.lib" />

            <formatter type="xml" />
            <!--Batch test exclude inner class-->
            <batchtest todir="${junitReport.dir}" haltonfailure="no">
                <fileset dir="${testclass.dir}">
                    <include name="**/*Test.class" />
                </fileset>
            </batchtest>
        </junit>
    </target>
    <target name="junitReport" depends="test">
        <junitreport todir="${junitReport.dir}">
            <fileset dir="${junitReport.dir}">
                <include name="*" />
            </fileset>
            <report format="frames" todir="${junitReport.dir}" />
        </junitreport>
    </target>
    <target name="coverageReport" depends="test">
        <emma enabled="${emma.enabled}">
            <report sourcepath="${src.dir}"
            sort="+block,+name,+method,+class"
            metrics="method:70,block:80,line:80,class:100">
                <fileset dir="${coverage.dir}">
                    <include name="*.emma" />
                </fileset>
                <html outfile="${coverage.dir}/coverage.html"
                depth="method" columns="name,class,method,block,line" />
            </report>
        </emma>
    </target>

 

    <target name="execute"

depends="init,compileSrc,instrument,compileTest,test,junitReport,coverageReport">
    </target>
</project>
         由于部署junit报告和emma报告的过程和之前的一个例子相似,所以给出的脚本就不包含这两个部署过程了。关于emma的一些特定ant的任务,请大家自行查阅相关资料,本文的目的还是在于关注ant脚本的整个流程,如何让脚本帮助进行快速开发。事实上即时没有持续集成工具,这样的一个脚本已经实现了大部分的自动构建功能了。完全可以手动选择时间来运行这个脚本以构建完整的系统。
         最后我想说的是,ant是帮助你提高效率的,我们需要关注的不是ant如何使用,而是何时使用。你是否在你的琐碎的日常工作中想到用 ant来帮助你提高效率呢?

【脑电分析系列】第7篇:频域分析基石 — 功率谱密度(PSD)的计算与常见方法对比 本文探讨了脑电图(EEG)频域分析的核心方法——功率谱密度(PSD)。通过对比基于快速傅里叶变换的周期图法和更稳健的Welch's方法,指出后者通过分段、加窗和平均处理,能有效降低估计方差,更适合分析非稳态的脑电信号。文章详细解析了关键参数设置对频率分辨率和统计稳定性的影响,并提供了Python计算实现。PSD分析将复杂的脑电信号转换为直观的频域特征,为研究认知功能和神经疾病提供重要依据。 阅读详情

相关推荐

【新华三】通过路由复制实现Public与VRF路由互通

如上图所示,S6900设备里有两张表,一张是public路由表,默认所有的路由都存放在public路由表里;除此之外还创建了VRF test,因此此设备还有VRF test路由表。通过路由复制实现Public路由和VRF路由互通,默认情况下VRF里的路由单独一张路由表,默认情况下与public路由表相互隔离,两张表之间不可互访。此时的public路由表里面并没有test的路由表。public路由表与VRF路由表之间相互隔离。此时VRF test里的路由也没有其他VRF或Public里的路由,相互隔离。

五大连池的镜子 5283

【QT】安装QT环境 直接可用包

帖子的起源 Why:体验QT多平台 1、上周花了两天的时间 ,QT配安卓环境,快要放弃的时候,最后是一个帖子救了。 里面把环境直接一键打包了,原本以为只是工具集,没想到是直接载入集,Surperise!!!直接能用。 这之前跟着网上的各种帖子,又是下载各种版本,又是升级QT create,又是下ant,ndk , ssl去匹配,怎么都不行。 我见到最多的是这个 甚至翻了墙(小飞机 一年120),这个可能还是有必要的,不然下工具卡在哪一步就很尴尬。 干净的谷歌搜索,就是一个美,清爽。 最后终于

weixin_39773385的博客 3234

Rasa Core开发指南

文章目录1. Rasa Core简介1.1 Rasa Core消息处理流程1.2 安装Rasa Core2. Dialogue模型训练2.1 Story样本数据2.2 Domain2.2.0 intents2.2.1 actions2.2.2 templates2.2.3 entities2.2.4 slots3 .训练和使用对话模型3.1 训练对话模型3.2 使用对话模型4. 搭建CustomA...

老蒋也疯狂 1万+

基于CPU下的实时人脸识别系统

最近想做一个演示Demo,用以演示和人脸相关的功能。但百度或Google之后,并没有找到比较适合的UI布局,所以只能自己动手,丰衣足食啦。经过这几天的努力,终于将演示Demo的整个UI框架写好了,后面只要往里填充功能就可以将整个系统支撑起来了。本人对QT了解也不是很深,其中错误之处还望海涵。 实现功能 (1)qt下配置opencv并读取默认摄像头 (2)480P、720P、1280P三种分辨率摄...

Ant 1427

38、四旋翼无人机的机械建模、控制与仿真及小型无人机高度的最优鲁棒无模型控制

本文探讨了四旋翼无人机的机械建模、控制与仿真方法,采用基于PID控制器的分层控制策略实现稳定飞行与路径跟踪,并开发了结合CAD模型与MATLAB环境的飞行模拟器。同时,针对小型无人机高度控制问题,提出了一种基于粒子群优化(PSO)的最优鲁棒无模型控制(PSO-MFC)方法,有效解决了参数整定难题,实现了零稳态误差跟踪和强抗干扰能力。两种方法在仿真中均表现出良好性能,为无人机控制系统的设计与优化提供了理论与实践基础。

l6m7n8的博客 101

【四足机器人项目实战】四足机器人腿部机械结构设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对四足机器人–腿部机械结构设计做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 为了减轻腿部惯量,使用有限元分析着重进行轻量化设计,小腿采用工字梁方案,大腿采用内部镂方案,并使用1.5 mm的AL 6061硬质材料,轻量化的腿部设了腿部运动时摆动

qq_35635374的博客 7540

Qt for Android - ANT_HOME is set incorrectly or ant could not be located

ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME.Qt 制作android的软件包时(*.apk),需要用到ant这个工具。所以首先要确定有没有安装,然后找出其路径,填写到Qt Creator的设定里就可以。Windows: 从https://ant.apache.org/bindownload

minixxie的专栏 778

【LLC快速上手系列】LLC轻载时,死区时间怎么调才对?别再傻傻乱搞了!

死区时间,就是指。如果你死区设得好,就能让开通前 ( V_DS to 0 ),完美实现!

weixin_43199439的博客 1857

Eclipse中集成Ant实现快速开发

 Eclipse中集成Ant实现快速开发   如今Java程序员中很少有人使用命令行方式编程,

wyh_1983的专栏 1904

北斗导航 | SPP、RTK、RTD、PPP-RTK、PPP算法原理,公式及完整matlab代码

开发参考:SPP适合入门学习GNSS定位原理和最小二乘。RTK是工程高精度定位主流方案,但依赖基站。PPP适合无基站区域的广域高精度应用。PPP-RTK是融合两者优点的新一代技术,但系统复杂度最高。· 代码资源:raPPPid(VieVS PPP)是功能完整的MATLAB开源PPP工具箱,支持多系统PPP-AR。MATLAB GPS Toolbox 提供从SPP到PPP的完整功能实现。· 实际应用:农业自动驾驶、无人机航测通常使用网络RTK;大地测量、地壳形变监测常采用PPP事后处理;

尘世冰封的专栏 830

02 - GRACE数据处理步骤简叙

本篇对GRACE数据处理的过程进行了介绍,简单叙述了进行数据各种改正的原因,可以帮助理解GRACE数据处理理论,本文借鉴了多篇优秀博士论文。希望可以对👪有所帮助。

weixin_43339605的博客 3348

[小白必看] 前端小白怎么用Ant design pro快速开发前端

使用Ant Design Pro of Vue框架开发接口平台前端的经验。作为前端新手,作者通过文档学习快速搭建了项目,包括移除ESLint、解决依赖问题、配置路由菜单和请求封装等关键步骤。文章详细介绍了如何通过修改router.config.js实现菜单动态生成、利用封装好的axios进行API调用,并保留了原始组件便于快速开发。后端部分简要提及了第三方接口调用(通过网关路由)和全局异常处理方案。整个项目采用Vue2版本,适合后端开发者快速实现基础前端功能,文中配有界面截图和代码示例辅助说明

m0_65795577的博客 812

3.1 5分钟搞定!Claude Code接入国产大模型完整教程(附代码)

摘要 本文提供了一份5分钟快速为Claude Code接入国产大模型的完整教程。首先介绍了系统环境要求(Windows/macOS/Linux、Node.js 18+、Python 3.8+),然后详细说明了三种安装Claude Code的方式(npm/yarn/pnpm)。重点讲解了两种国产大模型接入方案:通义千问(推荐)和文心一言,包括获取API密钥、安装SDK、创建MCP服务器、配置Claude Code等步骤。文中提供了详细的代码示例和配置文件模板,确保开发者能快速完成国产大模型的接入,降低使用成本

yonggeit的博客 7926

[转载]Eclipse中集成Ant实现快速开发

Eclipse中集成Ant实现快速开发如今Java程序员中很少有人使用命令行方式编程,而越来越多的人习惯使用某种IDE,且大部分选择Eclipse。本文将你展示如何在Eclipse中 集成Ant-从在Eclipse中创建工程到...

congji3817的博客 161

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

如何快速掌握Ant Design Pro Table:企业级表格开发的终极指南

在当今数据驱动的时代,高效展示和管理数据已成为企业应用的核心需求。Ant Design Pro Table作为Ant Design生态中的专业表格组件,为企业级应用提供了强大的表格解决方案。无论你是前端开发新手还是资深工程师,掌握Pro Table的使用都能显著提升开发效率和数据展示质量。 ## 🚀 快速上手:五分钟搭建专业表格 首先通过简单的安装命令获取Pro Table组件: ```b

gitblog_00975的博客 987

终极指南:如何快速掌握Ant Design Mobile移动端UI组件库开发

Ant Design Mobile是一个功能强大的移动端UI组件库,专为构建高质量移动Web应用而设计。本文将为您提供一份全面的实战指南,帮助您快速上手并掌握这个优秀的前端开发工具。 ## 🚀 10分钟极速安装与配置 ### 一键安装步骤 Ant Design Mobile提供多种安装方式,选择适合您项目的方式: ```bash $ npm install --save antd-mob

gitblog_01019的博客 1152

[Spring+Hibernate系列] 3.开发环境快速Ant 部署

前言除了在上一篇中提到的导出war 部署测试之外,在开发环境中快速部署开发和测试, 有很多中手法。 这里介绍两种1. 直接在Eclipse 中运行eclipse 本身提供这样的特性, 只要把Tomcat 相关的设定设置好,就可以直接 "Run on Server"2. 使用Ant 进行构建eclipse 中也继承了ant. 添加build.xml 和 build.properties 两个文件到同

oscar999的专栏 1072

umi与Ant Design Pro集成:快速开发中后台系统

中后台系统开发常面临重复构建布局、权限管理、数据交互等问题。umi作为React生态的企业级框架,与Ant Design Pro结合可显著提升开发效率。本文将从环境搭建、项目配置到功能实现,完整呈现集成方案。 ## 环境准备与项目初始化 ### 安装umi 使用npm或yarn全局安装umi: ```bash npm install -g umi # 或 yarn global add umi...

gitblog_00213的博客 389

vue-cli 3 中结合Ant Design快速开发项目

安装和初始化 一、我们需要在命令行中首先安装 cnpm或yarn包,安装过程中你可以用npm或cnpm或yarn。 npm install -g cnpm --registry=https://registry.npm.taobao.org 或 npm install -g yarn --registry=https://registry.npm.taobao.org npm或cnpm...

bluemengcom的博客 1484

5分钟快速上手:Ant Design Pro Blazor企业级应用开发终极指南

还在为复杂的Blazor企业应用开发而烦恼吗?Ant Design Pro Blazor为您提供了一套完整的解决方案,让您能够快速构建专业的企业级应用程序。这款基于.NET Blazor框架的开源项目,专为企业管理后台和数据分析平台量身定制。 ## 为什么选择Ant Design Pro Blazor? 作为一款专为企业级应用设计的Blazor框架,Ant Design Pro Blazor提

gitblog_00236的博客 932

如何快速扩展与二次开发ant-admin:基于Ant Design与D3.js的后台管理平台指南

ant-admin是一个基于Ant Design的后台管理平台,专注于在React框架中集成D3.js实现数据可视化功能。本文将为新手开发者提供一套完整的项目扩展与二次开发指南,帮助你快速上手并定制属于自己的管理系统。 ## 📋 项目结构解析:核心模块与文件路径 在开始扩展前,先了解ant-admin的项目结构是关键。以下是核心目录及其功能: - **组件目录**:[src/compone

gitblog_00372的博客 543

基于vue Ant-Design 的表单设计器,快速开发

基于vue Ant-Design 的表单设计器,快速开发https://gitee.com/kcz66/k-form-design/ 表单设计器 k-form-design image 简介 参考项目vue-form-making,基于vue和ant-design-vue实现的表单设计器,样式使用less作为开发语言,主要功能是能通过简单操作来生成配置表单,生成可保存的JSON数据,并能...

一人创客的博客 3994
上一篇: 从myspace转移完毕
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值