浏览 1142 次
锁定老帖子 主题:使用Ant打包整个项目
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2014-11-13
Maven的出现,使得项目管理,更加方便,快捷,但并不意味着Ant就从此消失了,现在很多的Apache的项目,依旧提供了Ant编译的方式,有的既提供了Ant的编译方式,也提供了Maven的编译方式,他们的优劣,散仙在这里就不加以讨论了,因为这种话题没什么具体的意义,合适的项目就选择合适的构建工具即可!
1,我们先看下,使用ant打包整个项目,并运行的例子:散仙的例子里,使用的jar包有lucene的,也有jdk自带的,所以打包整个项目,并使用java -cp xx.jar ,项目的主要两个测试类如下: <pre name="code" class="java">package com.study.lucene; /** * * 仅仅依赖JDK运行 * * * * **/ public class TestReadControl { public static void main(String[] args) { if(args.length&lt;1){ System.out.println("你没有传递任何参数!"); }else{ for(String s:args){ System.out.println("你传递的是: "+s); } } } } </pre> <pre name="code" class="java">package com.study.lucene; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.miscellaneous.PatternAnalyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; /** * * 依赖lucene和jdk * * * **/ public class TestAnalysis { public static void main(String[] args) throws Exception { String text="你没有输入任何内容!"; if(args.length==1){ text=args[0]; } Analyzer analyzer=new StandardAnalyzer(); //空字符串代表单字切分 TokenStream ts= analyzer.tokenStream("field", new StringReader(text)); CharTermAttribute term=ts.addAttribute(CharTermAttribute.class); ts.reset(); while(ts.incrementToken()){ System.out.println(term.toString()); } ts.end(); ts.close(); } } </pre> 当前的结构路径,如下: 注意,lucene依赖的jar包,在build.xml里有依赖拷贝,下面看下build.xml里面的内容:、 <pre name="code" class="xml">&lt;project name="${component.name}" basedir="." default="jar"&gt; &lt;property environment="env"/&gt; &lt;!-- 如果在这个地方配置hadoop的home,只需编译时用, 在project.classpath里面定义home即可 &lt;property name="hadoop.home" value="${env.HADOOP_HOME}"/&gt; --&gt; &lt;property name="hadoop.home" value="D:\hadooplib"/&gt; &lt;property name="lucene.home" value="D:\lucenelib"/&gt; &lt;!-- 指定jar包的名字 --&gt; &lt;property name="jar.name" value="myjob.jar"/&gt; &lt;!-- 编译时的依赖环境 --&gt; &lt;path id="project.classpath"&gt; &lt;fileset dir="lib"&gt; &lt;include name="*.jar" /&gt; &lt;/fileset&gt; &lt;fileset dir="${lucene.home}"&gt; &lt;include name="*.jar" /&gt; &lt;/fileset&gt; &lt;!-- &lt;fileset dir="${hadoop.home}"&gt; &lt;include name="**/*.jar" /&gt; &lt;/fileset&gt; --&gt; &lt;/path&gt; &lt;!-- 编译前清空上次的bin文件 --&gt; &lt;target name="clean" &gt; &lt;delete dir="bin" failonerror="false" /&gt; &lt;mkdir dir="bin"/&gt; &lt;/target&gt; &lt;!-- 构建编译源码 --&gt; &lt;target name="build" depends="clean"&gt; &lt;echo message="${ant.project.name}: ${ant.file}"/&gt; &lt;javac destdir="bin" encoding="utf-8" debug="true" includeantruntime="false" debuglevel="lines,vars,source"&gt; &lt;src path="src"/&gt; &lt;exclude name="**/.svn" /&gt; &lt;classpath refid="project.classpath"/&gt; &lt;/javac&gt; &lt;copy todir="bin"&gt; &lt;fileset dir="src"&gt; &lt;include name="*config*"/&gt; &lt;/fileset&gt; &lt;/copy&gt; &lt;/target&gt; &lt;!-- 构建jar包时,会拷贝到lib目录里 --&gt; &lt;target name="jar" depends="build"&gt; &lt;copy todir="bin/lib"&gt; &lt;fileset dir="lib"&gt; &lt;include name="**/*.*"/&gt; &lt;/fileset&gt; &lt;/copy&gt; &lt;!-- 去掉下面的注释时,下面的lib包会被拷贝到lib目录里 --&gt; &lt;!-- &lt;echo message="111"/&gt; --&gt; &lt;copy todir="bin/lib"&gt; &lt;fileset dir="${lucene.home}"&gt; &lt;include name="**/*.*"/&gt; &lt;/fileset&gt; &lt;/copy&gt; &lt;!--&lt;echo message="222"/&gt;--&gt; &lt;!-- lib-classpath , my.classpath,可以直接在linux上对应的home里,加载lib包 --&gt; &lt;path id="lib-classpath"&gt; &lt;fileset dir="lib" includes="**/*.jar" /&gt; &lt;fileset dir="${lucene.home}" includes="**/*.jar" /&gt; &lt;/path&gt; &lt;pathconvert property="my.classpath" pathsep=" " &gt; &lt;mapper&gt; &lt;chainedmapper&gt; &lt;!-- 移除绝对路径 --&gt; &lt;flattenmapper /&gt; &lt;!-- 加上lib前缀 --&gt; &lt;globmapper from="*" to="lib/*" /&gt; &lt;/chainedmapper&gt; &lt;/mapper&gt; &lt;path refid="lib-classpath" /&gt; &lt;/pathconvert&gt; &lt;jar basedir="bin" destfile="${jar.name}" &gt; &lt;include name="**/*"/&gt; &lt;!-- define MANIFEST.MF --&gt; &lt;manifest&gt; &lt;attribute name="Class-Path" value="${my.classpath}" /&gt; &lt;/manifest&gt; &lt;/jar&gt; &lt;/target&gt; &lt;/project&gt;</pre> 然后在对应的同级目录下提供lib目录,放入依赖的jar包即可 第二种方式,编译时候在windows上,引入需要依赖的jar,但并不把依赖的jar包打入lib目录下,然后再linux上,使用cp命令,把依赖的jar包拷贝入: <pre name="code" class="xml">&lt;project name="${component.name}" basedir="." default="jar"&gt; &lt;property environment="env"/&gt; &lt;!-- 如果在这个地方配置hadoop的home,只需编译时用, 在project.classpath里面定义home即可 &lt;property name="hadoop.home" value="${env.HADOOP_HOME}"/&gt; --&gt; &lt;property name="hadoop.home" value="D:\hadooplib"/&gt; &lt;property name="lucene.home" value="D:\lucenelib"/&gt; &lt;!-- 指定jar包的名字 --&gt; &lt;property name="jar.name" value="myjob.jar"/&gt; &lt;!-- 编译时的依赖环境 --&gt; &lt;path id="project.classpath"&gt; &lt;fileset dir="lib"&gt; &lt;include name="*.jar" /&gt; &lt;/fileset&gt; &lt;fileset dir="${lucene.home}"&gt; &lt;include name="*.jar" /&gt; &lt;/fileset&gt; &lt;!-- &lt;fileset dir="${hadoop.home}"&gt; &lt;include name="**/*.jar" /&gt; &lt;/fileset&gt; --&gt; &lt;/path&gt; &lt;!-- 编译前清空上次的bin文件 --&gt; &lt;target name="clean" &gt; &lt;delete dir="bin" failonerror="false" /&gt; &lt;mkdir dir="bin"/&gt; &lt;/target&gt; &lt;!-- 构建编译源码 --&gt; &lt;target name="build" depends="clean"&gt; &lt;echo message="${ant.project.name}: ${ant.file}"/&gt; &lt;javac destdir="bin" encoding="utf-8" debug="true" includeantruntime="false" debuglevel="lines,vars,source"&gt; &lt;src path="src"/&gt; &lt;exclude name="**/.svn" /&gt; &lt;classpath refid="project.classpath"/&gt; &lt;/javac&gt; &lt;copy todir="bin"&gt; &lt;fileset dir="src"&gt; &lt;include name="*config*"/&gt; &lt;/fileset&gt; &lt;/copy&gt; &lt;/target&gt; &lt;!-- 构建jar包时,会拷贝到lib目录里 --&gt; &lt;target name="jar" depends="build"&gt; &lt;copy todir="bin/lib"&gt; &lt;fileset dir="lib"&gt; &lt;include name="**/*.*"/&gt; &lt;/fileset&gt; &lt;/copy&gt; &lt;!-- 去掉下面的注释时,下面的lib包会被拷贝到lib目录里 --&gt; &lt;!-- &lt;echo message="111"/&gt; &lt;copy todir="bin/lib"&gt; &lt;fileset dir="${lucene.home}"&gt; &lt;include name="**/*.*"/&gt; &lt;/fileset&gt; &lt;/copy&gt;--&gt; &lt;!--&lt;echo message="222"/&gt;--&gt; &lt;!-- lib-classpath , my.classpath,可以直接在linux上对应的home里,加载lib包 --&gt; &lt;!-- 将jar包的路径载入classpath里 --&gt; &lt;path id="lib-classpath"&gt; &lt;fileset dir="lib" includes="**/*.jar" /&gt; &lt;!-- &lt;fileset dir="${lucene.home}" includes="**/*.jar" /&gt; --&gt; &lt;/path&gt; &lt;pathconvert property="my.classpath" pathsep=" " &gt; &lt;mapper&gt; &lt;chainedmapper&gt; &lt;!-- 移除绝对路径 --&gt; &lt;flattenmapper /&gt; &lt;!-- 加上lib前缀 --&gt; &lt;globmapper from="*" to="lib/*" /&gt; &lt;/chainedmapper&gt; &lt;/mapper&gt; &lt;path refid="lib-classpath" /&gt; &lt;/pathconvert&gt; &lt;jar basedir="bin" destfile="${jar.name}" &gt; &lt;include name="**/*"/&gt; &lt;!-- define MANIFEST.MF --&gt; &lt;manifest&gt; &lt;attribute name="Class-Path" value="${my.classpath}" /&gt; &lt;/manifest&gt; &lt;/jar&gt; &lt;/target&gt; &lt;/project&gt;</pre> linux下的目录 <pre name="code" class="java">drwxrwxr-x 4 search search 4096 Nov 12 17:10 bin -rw-rw-r-- 1 search search 2740 Nov 12 17:07 build.xml drwxrwxr-x 2 search search 4096 Nov 12 17:10 lib -rw-rw-r-- 1 search search 25726164 Nov 12 17:10 myjob.jar drwxrwxr-x 3 search search 4096 Nov 12 17:10 src -rw-rw-r-- 1 search search 577 Nov 12 17:27 ss.sh [search@fsedump03sand LuceneDemo]$ </pre> 执行脚本如下: <pre name="code" class="shell"> [search@fsedump03sand LuceneDemo]$ cat ss.sh cs='.:' libpath="/home/search/lucenedemo/lib/lucenelib/" #jarlib=`ls $libpath` #echo $jarlib for txt in `ls $libpath` do cs=$cs$libpath$txt: done #拼接上主程序类 cs=$cs"./myjob.jar" echo $cs echo "运行没有依赖的jar包" java -cp myjob.jar com.study.lucene.TestReadControl echo "===================运行有依赖,无传参=======================" java -cp $cs com.study.lucene.TestAnalysis echo "======================运行有依赖,有传参====================" java -cp $cs com.study.lucene.TestAnalysis "i am 啊 中国人 " </pre> 运行结果如下: <pre name="code" class="java">[search@fsedump03sand LuceneDemo]$ sh ss.sh .:/home/search/lucenedemo/lib/lucenelib/lucene-analyzers-common-4.10.2.jar:/home/search/lucenedemo/lib/lucenelib/lucene-core-4.10.2.jar:/home/search/lucenedemo/lib/lucenelib/lucene-queryparser-4.10.2.jar:./myjob.jar 运行没有依赖的jar包 你没有传递任何参数! ===================运行有依赖,无传参======================= 你 没 有 输 入 任 何 内 容 ======================运行有依赖,有传参==================== i am 啊 中 国 人 [search@fsedump03sand LuceneDemo]$ </pre> 第二种方式,仅仅在编译期间,引用了windows上的依赖jar,而并不需要,把windows上的一些jar打入jar包里,因为这些jar可能很大,例如hadoop的或hbase的,当然不引入,并不代表我们不需要,编译期仍然需要,参与编译,传到服务器上时,服务器已经有jar包了,所以不需要在windows上,上传上去,因为我们在linux上,使用cp命令,拷贝载入了需要依赖的jar所以才没报错,可以正常运行,如需在ant里调试,可以使用echo脚本进行打印显示。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |