要运行ant需要有一个build.xml,下边就是一个完整的build.xml,我们来详细的解释每一句:
<?xml version="1.0" encoding="UTF-8" ?> <project name="HelloWorld" default="run" basedir="."> <property name="src" value="src"/> <property name="dest" value="classes"/> <property name="hello_jar" value="hello1.jar"/> <target name="init"> <mkdir dir="${dest}"/> </target> <target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}"/> </target> <target name="build" depends="compile"> <jar jarfile="${hello_jar}" basedir="${dest}"/> </target> <target name="run" depends="build"> <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/> </target> <target name="clean"> <delete dir="${dest}" /> <delete file="${hello_jar}" /> </target> <target name="rerun" depends="clean,run"> <ant target="clean" /> <ant target="run" /> </target> </project>详细解释
<project name="HelloWorld" default="run" basedir="."> </project>
ant的所有内容必须包含在这个里边,name是你给它取的名字,basedir故名思意就是工作的根目录 .代表当前目录。default代表默认要做的事情。
<property name="src" value="src"/>
类似程序中的变量,为什么这么做想一下变量的作用
<target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}"/> </target>
把你想做的每一件事情写成一个target ,它有一个名字,depends是它所依赖的target,在执行这个target 例如这里的compile之前ant会先检查init是否曾经被执行过,如果执行
过则直接直接执行compile,如果没有则会先执行它依赖的target例如这里的init,然后在执行这个target 如我们的计划
编译:
<target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}"/> </target>
做jar包:
<target name="build" depends="compile"> <jar jarfile="${hello_jar}" basedir="${dest}"/> </target>
运行:
<target name="run" depends="build"> <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/> </target>
为了不用拷贝,我们可以在最开始定义好目标文件夹,这样ant直接把结果就放在目标文件夹中了
新建文件夹:
<target name="init"> <mkdir dir="${dest}"/> </target>
为了更多一点的功能体现,又加入了两个target
删除生成的文件
<target name="clean"> <delete dir="${dest}" /> <delete file="${hello_jar}" /> </target>
再次运行,这里显示了如何在一个target里边调用其他的target
<target name="rerun" depends="clean,run"> <ant target="clean" /> <ant target="run" /> </target>
好了,解释完成了,下边检验一下你的ant吧
新建一个src的文件夹,然后把HelloWorld.java按照包目录放进去,做好build.xml文件,在命令行下键入ant ,你会发现一个个任务都完成了。每次更改完代码只需要再次键入ant,有的时候我们可能并不想运行程序,只想执行这些步骤中的某一两个步骤,例如我只想重新部署而不想运行,键入:ant build,ant中的每一个任务都可以这样调用ant + target name,好了,这样一个简单的ant任务完成了。
命令行参考 A-Z :http://technet2.microsoft.com/WindowsServer/zh-CHS/Library/552ed70a-208d-48c4-8da8-2e27b530eac72052.mspx?mfr=true
要学习某个命令,最好的方法是阅读该命令的联机帮助。可以输入“命令名/?”或“help命令名”来查看命令的联机帮助,例如“format/?”。
md::mkdir
rd:rmdir
dir: ls
参数“/P”为分屏显示;
参数“/w”为简要显示(只显示文件名,文件夹用[]标注)
“/b”类似“/w”,只是文件夹不特殊标注
del :删除文件
ren :重命名文件
格式:ren 原文件 新文件
copy:复制文件
copy 源文件[+源文件] 目标文件
如:C:\>copy pic\ws?.jpg F:
C:\>copy a1+a2 (将a2 的内容添加到a1 尾)
> 覆盖
>> 追加
例: E:\> dir *.mp3 >> mp3.txt
字符< 用于修改输入(某些命令从键盘读取的输入) --------------------------> 用法见本文最后
是一个操作符,它把输入和输出重定向结合在一起,从而将一个命令的输出立即作为另一个命令的输入。管道用竖直线字符(|)表示,该字符通常位于Enter键附近。最经典的使用管道的命令:more。可以说该命令大部分情况下都和管道一起使用。例如,要查看sort 命令的帮助信息,输入sort/? ,但一屏显示不完,使用sort/?| more来分屏显
示。
C:\>sort/?| more
SORT[/R][/+n][/Mkilobytes][/Llocale] [/RECrecordbytes]
[[drive1:][path1]filename1][/T[drive2:][path2]]
[/O[drive3:][path3]filename3]
/+n 指定开始每个比较的字符号码n。/+3 说明每个
另一个经典的使用管道的命令是find ,用来过滤输出。例如,我要查看当前的环境变量,
但我只对PATH 感兴趣,则输入:
C:\>set| find"Path"
Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\bin;D:\soft\GnuP
G\pub
使用con(控制台/键盘)
C:\>copycont.txt (读取键盘输入,并复制到t.txt)
Hello,world!(此处用键盘输入,以Ctrl+Z结束)
^Z
已复制 1个文
巧用nul"粉碎"文件
C:\>copynult.txt (将“空”复制到t.txt ,这样就将t.txt 的大小改写为了0字节)
变量的值。
C:\>set(列出当前所有环境变量及其值)
……省略输出若干……
windir=C:\WINDOWS
C:\>cd %windir%(该命令在执行时,“%windir%”会自动被替换成“C:\WINDOWS”)
C:\WINDOWS>set str=Hello! (用“set 变量名=变量值”来设置一个变量)
C:\WINDOWS>echo %str%(echo 命令可回显一个字符串)
Hello!
变量给命令或批处理文件带来了极大的灵活性,多用于批处理文件中。
可以在批处理文件中包含任何命令。某些命令,比如for、goto 和if 命令等,它们允许你对批处理文件中的命令作条件流程控制。例如,if 命令根据条件语句的结果来执行命令。
有关批处理文件的详细信息,请参考以下命令的帮助页。
命令 功能
rem 添加一段注释
echo 显示信息,或将命令回显打开或关上
if 执行批处理程序中的条件性处理
for 为一套文件中的每个文件运行一个指定的命令
goto 跳转到批处理程序中某个标明的行执行
pause 暂停批文件的处理并显示消息
call 从一个批处理程序调用另一个批处理程序,而不 终止父批处理程序
pushd 保存当前目录,然后对其进行更改
popd 还原 pushd 保存的当前目录的上一个值
shift 更换批文件中可替换参数的位置
setlocal 开始批文件中环境更改的本地化
endlocal 结束批文件中环境更改的本地化
title 设置 cmd.exe 会话的窗口标题
start 启动另一个窗口来运行指定的程序或命令
几个应用实例
#include <iostream> #include <string> #include <sstream> #include <cmath> using namespace std; class C24p { private: struct Cell{ union{ double dbl; char sig; //1+2-3*4/ }num; char typ; //0数值1符号 int id; Cell* left; Cell* right; Cell():left(NULL),right(NULL){} }exp[7],ele[8]; char exitflag; ostringstream out; void putele(int n); bool chkele(int n); bool cal(); void show(); void toformulate(C24p::Cell* root); char sigprio(const C24p::Cell &val); //符号优先级 public: C24p(double num1=1,double num2=1,double num3=1,double num4=1); const string getstr() const; void run(); }; C24p::C24p(double num1,double num2,double num3,double num4) { int i; ele[0].num.dbl=num1; ele[1].num.dbl=num2; ele[2].num.dbl=num3; ele[3].num.dbl=num4; for(i=0;i<4;++i){ ele[i].typ=0; //数值 ele[i+4].typ=1; //符号 ele[i+4].num.sig=i+1; } for(i=0;i<8;++i){ ele[i].id=i; } exitflag=0; } void C24p::putele(int n) { int start,end; start=0; if(n<2){ end=4; } else{ end=8; } for(int i=start;i<end;++i){ exp[n]=ele[i]; if(chkele(n)){ putele(n+1); } if(exitflag==1){ break; } } } bool C24p::chkele(int n) { int i; int nums=0,sigs=0; for(i=0;i<=n;++i){ if(exp[i].typ==0){ //数值 ++nums; } else{ ++sigs; } } if(nums-sigs<1){ return false; } if(exp[n].typ==0){ //数值 for(i=0;i<n;++i){ if(exp[i].id == exp[n].id){ return false; } } } if(n==7-1){ if(nums!=4 || sigs!=3){ return false; } if(exp[n].typ!=1){ //不是符号 return false; } if(cal()){ exitflag=1; } return false; } return true; } bool C24p::cal() { double dblstack[4]; int stackp=-1; int i; for(i=0;i<7;++i){ if(exp[i].typ==0){ ++stackp; dblstack[stackp]=exp[i].num.dbl; } else{ switch(exp[i].num.sig){ case 1: dblstack[stackp-1] = dblstack[stackp-1]+dblstack[stackp]; break; case 2: dblstack[stackp-1] = dblstack[stackp-1]-dblstack[stackp]; break; case 3: dblstack[stackp-1] = dblstack[stackp-1]*dblstack[stackp]; break; case 4: dblstack[stackp-1] = dblstack[stackp-1]/dblstack[stackp]; break; } --stackp; } } if(fabs(dblstack[stackp]-24) <= 0.1){ show(); return true; } else{ return false; } } const string C24p::getstr() const { return out.str(); } void C24p::run() { putele(0); } void C24p::show() { int expstack[4]; int pstack=-1; for(int i=0;i<7;++i){ if(exp[i].typ==0){ //数值 ++pstack; expstack[pstack]=i; } else{ exp[i].right=&exp[expstack[pstack]]; --pstack; exp[i].left=&exp[expstack[pstack]]; expstack[pstack]=i; } } toformulate(exp+expstack[pstack]); } void C24p::toformulate(C24p::Cell* root) { char sigtyp; switch((*root).num.sig){ case 1: sigtyp='+'; break; case 2: sigtyp='-'; break; case 3: sigtyp='*'; break; case 4: sigtyp='/'; break; } if(root->left->typ == 0){ //数值 out << (*(root->left)).num.dbl; out << sigtyp; } else{ //符号 if(sigprio(*root) > sigprio(*(root->left))){ //当前优先级比左边优先级高 out << '('; toformulate(root->left); out << ')'; } else{ toformulate(root->left); } out << sigtyp; } if(root->right->typ == 0){ //数值 out << (*(root->right)).num.dbl; } else{ //符号 if(sigprio(*root) > sigprio(*(root->right))){ out << '('; toformulate(root->right); out << ')'; } else{ toformulate(root->right); } } } char C24p::sigprio(const C24p::Cell &val) { switch(val.num.sig){ case 1: case 2: return 1; case 3: case 4: return 2; default: return 0; } } int main() { C24p a(5,5,5,1); a.run(); cout << a.getstr(); return 1; }