使用Ant打包整个项目

淩亂°似流年 2022-04-12 06:27 341阅读 0赞

[b][color=green][size=large]Maven的出现,使得项目管理,更加方便,快捷,但并不意味着Ant就从此消失了,现在很多的Apache的项目,依旧提供了Ant编译的方式,有的既提供了Ant的编译方式,也提供了Maven的编译方式,他们的优劣,散仙在这里就不加以讨论了,因为这种话题没什么具体的意义,合适的项目就选择合适的构建工具即可![/size][/color][/b]

[b][color=green][size=large]1,我们先看下,使用ant打包整个项目,并运行的例子:散仙的例子里,使用的jar包有lucene的,也有jdk自带的,所以打包整个项目,并使用java -cp xx.jar ,项目的主要两个测试类如下:

[/size][/color][/b]

  1. package com.study.lucene;
  2. /**
  3. *
  4. * 仅仅依赖JDK运行
  5. *
  6. *
  7. *
  8. * **/
  9. public class TestReadControl {
  10. public static void main(String[] args) {
  11. if(args.length<1){
  12. System.out.println("你没有传递任何参数!");
  13. }else{
  14. for(String s:args){
  15. System.out.println("你传递的是: "+s);
  16. }
  17. }
  18. }
  19. }
  20. package com.study.lucene;
  21. import java.io.StringReader;
  22. import org.apache.lucene.analysis.Analyzer;
  23. import org.apache.lucene.analysis.TokenStream;
  24. import org.apache.lucene.analysis.miscellaneous.PatternAnalyzer;
  25. import org.apache.lucene.analysis.standard.StandardAnalyzer;
  26. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  27. /**
  28. *
  29. * 依赖lucene和jdk
  30. *
  31. *
  32. * **/
  33. public class TestAnalysis {
  34. public static void main(String[] args) throws Exception {
  35. String text="你没有输入任何内容!";
  36. if(args.length==1){
  37. text=args[0];
  38. }
  39. Analyzer analyzer=new StandardAnalyzer();
  40. //空字符串代表单字切分
  41. TokenStream ts= analyzer.tokenStream("field", new StringReader(text));
  42. CharTermAttribute term=ts.addAttribute(CharTermAttribute.class);
  43. ts.reset();
  44. while(ts.incrementToken()){
  45. System.out.println(term.toString());
  46. }
  47. ts.end();
  48. ts.close();
  49. }
  50. }

[b][color=green][size=large]当前的结构路径,如下:[/size][/color][/b]

[img]http://dl2.iteye.com/upload/attachment/0103/1105/bc751bcf-e46c-341d-9544-bc0df767118c.jpg\[/img\]
[b][color=green][size=large]注意,lucene依赖的jar包,在build.xml里有依赖拷贝,下面看下build.xml里面的内容:[/size][/color][/b]、

  1. <project name="${component.name}" basedir="." default="jar">
  2. <property environment="env"/>
  3. <!--
  4. 如果在这个地方配置hadoop的home,只需编译时用,
  5. 在project.classpath里面定义home即可
  6. <property name="hadoop.home" value="${env.HADOOP_HOME}"/>
  7. -->
  8. <property name="hadoop.home" value="D:\hadooplib"/>
  9. <property name="lucene.home" value="D:\lucenelib"/>
  10. <!-- 指定jar包的名字 -->
  11. <property name="jar.name" value="myjob.jar"/>
  12. <!-- 编译时的依赖环境 -->
  13. <path id="project.classpath">
  14. <fileset dir="lib">
  15. <include name="*.jar" />
  16. </fileset>
  17. <fileset dir="${lucene.home}">
  18. <include name="*.jar" />
  19. </fileset>
  20. <!-- <fileset dir="${hadoop.home}">
  21. <include name="**/*.jar" />
  22. </fileset> -->
  23. </path>
  24. <!-- 编译前清空上次的bin文件 -->
  25. <target name="clean" >
  26. <delete dir="bin" failonerror="false" />
  27. <mkdir dir="bin"/>
  28. </target>
  29. <!-- 构建编译源码 -->
  30. <target name="build" depends="clean">
  31. <echo message="${ant.project.name}: ${ant.file}"/>
  32. <javac destdir="bin" encoding="utf-8" debug="true" includeantruntime="false" debuglevel="lines,vars,source">
  33. <src path="src"/>
  34. <exclude name="**/.svn" />
  35. <classpath refid="project.classpath"/>
  36. </javac>
  37. <copy todir="bin">
  38. <fileset dir="src">
  39. <include name="*config*"/>
  40. </fileset>
  41. </copy>
  42. </target>
  43. <!-- 构建jar包时,会拷贝到lib目录里 -->
  44. <target name="jar" depends="build">
  45. <copy todir="bin/lib">
  46. <fileset dir="lib">
  47. <include name="**/*.*"/>
  48. </fileset>
  49. </copy>
  50. <!-- 去掉下面的注释时,下面的lib包会被拷贝到lib目录里 -->
  51. <!-- <echo message="111"/> -->
  52. <copy todir="bin/lib">
  53. <fileset dir="${lucene.home}">
  54. <include name="**/*.*"/>
  55. </fileset>
  56. </copy>
  57. <!--<echo message="222"/>-->
  58. <!-- lib-classpath , my.classpath,可以直接在linux上对应的home里,加载lib包 -->
  59. <path id="lib-classpath">
  60. <fileset dir="lib" includes="**/*.jar" />
  61. <fileset dir="${lucene.home}" includes="**/*.jar" />
  62. </path>
  63. <pathconvert property="my.classpath" pathsep=" " >
  64. <mapper>
  65. <chainedmapper>
  66. <!-- 移除绝对路径 -->
  67. <flattenmapper />
  68. <!-- 加上lib前缀 -->
  69. <globmapper from="*" to="lib/*" />
  70. </chainedmapper>
  71. </mapper>
  72. <path refid="lib-classpath" />
  73. </pathconvert>
  74. <jar basedir="bin" destfile="${jar.name}" >
  75. <include name="**/*"/>
  76. <!-- define MANIFEST.MF -->
  77. <manifest>
  78. <attribute name="Class-Path" value="${my.classpath}" />
  79. </manifest>
  80. </jar>
  81. </target>
  82. </project>

[b][color=green][size=large]然后在对应的同级目录下提供lib目录,放入依赖的jar包即可[/size][/color][/b]

[b][color=green][size=large]
第二种方式,编译时候在windows上,引入需要依赖的jar,但并不把依赖的jar包打入lib目录下,然后再linux上,使用cp命令,把依赖的jar包拷贝入:
[/size][/color][/b]

  1. <project name="${component.name}" basedir="." default="jar">
  2. <property environment="env"/>
  3. <!--
  4. 如果在这个地方配置hadoop的home,只需编译时用,
  5. 在project.classpath里面定义home即可
  6. <property name="hadoop.home" value="${env.HADOOP_HOME}"/>
  7. -->
  8. <property name="hadoop.home" value="D:\hadooplib"/>
  9. <property name="lucene.home" value="D:\lucenelib"/>
  10. <!-- 指定jar包的名字 -->
  11. <property name="jar.name" value="myjob.jar"/>
  12. <!-- 编译时的依赖环境 -->
  13. <path id="project.classpath">
  14. <fileset dir="lib">
  15. <include name="*.jar" />
  16. </fileset>
  17. <fileset dir="${lucene.home}">
  18. <include name="*.jar" />
  19. </fileset>
  20. <!-- <fileset dir="${hadoop.home}">
  21. <include name="**/*.jar" />
  22. </fileset> -->
  23. </path>
  24. <!-- 编译前清空上次的bin文件 -->
  25. <target name="clean" >
  26. <delete dir="bin" failonerror="false" />
  27. <mkdir dir="bin"/>
  28. </target>
  29. <!-- 构建编译源码 -->
  30. <target name="build" depends="clean">
  31. <echo message="${ant.project.name}: ${ant.file}"/>
  32. <javac destdir="bin" encoding="utf-8" debug="true" includeantruntime="false" debuglevel="lines,vars,source">
  33. <src path="src"/>
  34. <exclude name="**/.svn" />
  35. <classpath refid="project.classpath"/>
  36. </javac>
  37. <copy todir="bin">
  38. <fileset dir="src">
  39. <include name="*config*"/>
  40. </fileset>
  41. </copy>
  42. </target>
  43. <!-- 构建jar包时,会拷贝到lib目录里 -->
  44. <target name="jar" depends="build">
  45. <copy todir="bin/lib">
  46. <fileset dir="lib">
  47. <include name="**/*.*"/>
  48. </fileset>
  49. </copy>
  50. <!-- 去掉下面的注释时,下面的lib包会被拷贝到lib目录里 -->
  51. <!-- <echo message="111"/>
  52. <copy todir="bin/lib">
  53. <fileset dir="${lucene.home}">
  54. <include name="**/*.*"/>
  55. </fileset>
  56. </copy>-->
  57. <!--<echo message="222"/>-->
  58. <!-- lib-classpath , my.classpath,可以直接在linux上对应的home里,加载lib包 -->
  59. <!-- 将jar包的路径载入classpath里 -->
  60. <path id="lib-classpath">
  61. <fileset dir="lib" includes="**/*.jar" />
  62. <!-- <fileset dir="${lucene.home}" includes="**/*.jar" /> -->
  63. </path>
  64. <pathconvert property="my.classpath" pathsep=" " >
  65. <mapper>
  66. <chainedmapper>
  67. <!-- 移除绝对路径 -->
  68. <flattenmapper />
  69. <!-- 加上lib前缀 -->
  70. <globmapper from="*" to="lib/*" />
  71. </chainedmapper>
  72. </mapper>
  73. <path refid="lib-classpath" />
  74. </pathconvert>
  75. <jar basedir="bin" destfile="${jar.name}" >
  76. <include name="**/*"/>
  77. <!-- define MANIFEST.MF -->
  78. <manifest>
  79. <attribute name="Class-Path" value="${my.classpath}" />
  80. </manifest>
  81. </jar>
  82. </target>
  83. </project>

linux下的目录

  1. drwxrwxr-x 4 search search 4096 Nov 12 17:10 bin
  2. -rw-rw-r-- 1 search search 2740 Nov 12 17:07 build.xml
  3. drwxrwxr-x 2 search search 4096 Nov 12 17:10 lib
  4. -rw-rw-r-- 1 search search 25726164 Nov 12 17:10 myjob.jar
  5. drwxrwxr-x 3 search search 4096 Nov 12 17:10 src
  6. -rw-rw-r-- 1 search search 577 Nov 12 17:27 ss.sh
  7. [search@fsedump03sand LuceneDemo]$

执行脚本如下:

  1. [search@fsedump03sand LuceneDemo]$ cat ss.sh
  2. cs='.:'
  3. libpath="/home/search/lucenedemo/lib/lucenelib/"
  4. #jarlib=`ls $libpath`
  5. #echo $jarlib
  6. for txt in `ls $libpath`
  7. do
  8. cs=$cs$libpath$txt:
  9. done
  10. #拼接上主程序类
  11. cs=$cs"./myjob.jar"
  12. echo $cs
  13. echo "运行没有依赖的jar包"
  14. java -cp myjob.jar com.study.lucene.TestReadControl
  15. echo "===================运行有依赖,无传参======================="
  16. java -cp $cs com.study.lucene.TestAnalysis
  17. echo "======================运行有依赖,有传参===================="
  18. java -cp $cs com.study.lucene.TestAnalysis "i am 啊 中国人 "

运行结果如下:

  1. [search@fsedump03sand LuceneDemo]$ sh ss.sh
  2. .:/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
  3. 运行没有依赖的jar
  4. 你没有传递任何参数!
  5. ===================运行有依赖,无传参=======================
  6. ======================运行有依赖,有传参====================
  7. i
  8. am
  9. [search@fsedump03sand LuceneDemo]$

[b][color=green][size=large]第二种方式,仅仅在编译期间,引用了windows上的依赖jar,而并不需要,把windows上的一些jar打入jar包里,因为这些jar可能很大,例如hadoop的或hbase的,当然不引入,并不代表我们不需要,编译期仍然需要,参与编译,传到服务器上时,服务器已经有jar包了,所以不需要在windows上,上传上去,因为我们在linux上,使用cp命令,拷贝载入了需要依赖的jar所以才没报错,可以正常运行,如需在ant里调试,可以使用echo脚本进行打印显示。 [/size][/color][/b]

发表评论

表情:
评论列表 (有 0 条评论,341人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用Ant打包Apk

      文章[ Android 使用Ant打渠道包][Android _Ant]讲解了如何使用Ant打渠道包,没有涉及具体的编译过程,例如使用Ant如何生成R文件等。那么今天,使用