使用Ant打包精简版jar包

逃离我推掉我的手 2022-04-12 06:27 431阅读 0赞

[b][color=green][size=large]上篇,散仙讲了使用ant打包整个项目的方式,那样打包项目的总体大小,可能会变得非常臃肿,这样以来,整个jar包变得非常大,所以我们应该按需所取,灵活配置。

具体的思路就是,在打包时,配置ant的build.xml的脚本仅仅编译拷贝class,而不需要拷贝所用的jar包,或者一些其他的配置文件,比如xml或者一些log4j的文件,然后再启动时候,我们可以使用java -cp 把需要的jar包路径和配置文件的路径传进去,这样就比较灵活了,然后整个项目的jar包,会变得非常精简,

本次散仙的例子是打包一个有依赖lucene的分词器然后,并使用了log4j文件记录,注意,后面真正的运行时候,依赖的jar,log4j的包,还有一些配置文件,比如log4j等,会通过一个脚本动态的传参进去。

项目截图如下:

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

[img]http://dl2.iteye.com/upload/attachment/0103/1451/611ed1fa-4c29-3e9d-a6d8-feb0171c8ba9.jpg\[/img\]

[b][color=green][size=large]log4j的配置如下所示:[/size][/color][/b]

  1. log4j.rootCategory=INFO,fileout,errorout,stdout
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  3. log4j.appender.stdout.layout.ConversionPattern=%d{MM-dd HH\:mm\:ss.SSS}[%-30F\:%-5p\:%l] %m%n
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  5. log4j.appender.fileout=org.apache.log4j.DailyRollingFileAppender
  6. log4j.appender.fileout.layout.ConversionPattern=%d{MM-dd HH\:mm\:ss.SSS}[%-5p] %m%n
  7. log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
  8. log4j.appender.fileout.File=index_log
  9. log4j.appender.fileout.Append=true
  10. log4j.appender.fileout.DatePattern='.'yyyy-MM-dd
  11. log4j.appender.errorout=org.apache.log4j.RollingFileAppender
  12. log4j.appender.errorout.Threshold=ERROR
  13. log4j.appender.errorout.File=error_log
  14. log4j.appender.errorout.MaxFileSize=100000KB
  15. log4j.appender.errorout.MaxBackupIndex=10
  16. log4j.appender.errorout.Append=true
  17. log4j.appender.errorout.layout=org.apache.log4j.PatternLayout
  18. log4j.appender.errorout.layout.ConversionPattern=%d{MM-dd HH\:mm\:ss.SSS}[%-30F\:%-5p\:%l] %m%n

[b][color=green][size=large]build.xml的配置[/size][/color][/b]

  1. <project name="${component.name}" basedir="." default="jar">
  2. <!-- 引入环境变量 -->
  3. <property environment="env"/>
  4. <!-- -->
  5. <!-- 配置lucene的home地址,编译时用到,注意写法 -->
  6. <property name="lucene.home" value="${env.LUCENE_HOME}"/>
  7. <!-- 打印调试信息 -->
  8. <echo message="java的home是${env.LUCENE_HOME}"> </echo>
  9. <!-- 指定jar包的名字 -->
  10. <property name="jar.name" value="myjob.jar"/>
  11. <!-- 编译源码时需要依赖的jar包 -->
  12. <path id="project.classpath" >
  13. <fileset dir="lib">
  14. <include name="*.jar"/>
  15. </fileset>
  16. <fileset dir="${lucene.home}">
  17. <include name="*.jar"/>
  18. </fileset>
  19. </path>
  20. <!-- 编译前清空上次的bin文件 -->
  21. <target name="clean">
  22. <delete dir="bin" failonerror="false"></delete>
  23. <mkdir dir="bin"/>
  24. </target>
  25. <!-- 构建编译源码 一般为固定写法 -->
  26. <target name="build" depends="clean">
  27. <echo message="${ant.project.name}: ${ant.file}" ></echo>
  28. <javac destdir="bin" encoding="utf-8" debug="true" includeantruntime="false" debuglevel="lines,vars,source">
  29. <src path="src"/>
  30. <exclude name="**/.svn" />
  31. <classpath refid="project.classpath"/>
  32. </javac>
  33. <copy todir="bin">
  34. <fileset dir="src">
  35. <include name="*config*"/>
  36. </fileset>
  37. </copy>
  38. </target>
  39. <!-- 打包的jar -->
  40. <target name="jar" depends="build">
  41. <!-- 这里是精简版的配置,如果需要,可以在这里面配置拷贝依赖的jar到lib目录里 -->
  42. <!--
  43. <copy todir="bin/lib">
  44. <fileset dir="lib">
  45. <include name="**/*.*"/>
  46. </fileset>
  47. </copy>
  48. -->
  49. <jar basedir="bin" destfile="${jar.name}">
  50. <include name="**/*" />
  51. </jar>
  52. </target>
  53. </project>

[b][color=green][size=large]编写完成后,传到linux上,然后写个shell脚本,动态传入一些jar的路径和配置文件,例如log4j等,在linux上的目录执行ant后如下所示[/size][/color][/b]

  1. [search@fsedump03sand LuceneDemo]$ ant
  2. Buildfile: /home/search/LuceneDemo/build.xml
  3. [echo] hadoophome是/home/search/hadoop
  4. [echo] javahome是/home/search/lucenedemo/lib/lucenelib/
  5. clean:
  6. [delete] Deleting directory /home/search/LuceneDemo/bin
  7. [mkdir] Created dir: /home/search/LuceneDemo/bin
  8. buildwithout:
  9. [echo] ${component.name}: /home/search/LuceneDemo/build.xml
  10. [javac] Compiling 7 source files to /home/search/LuceneDemo/bin
  11. [javac] Note: /home/search/LuceneDemo/src/com/study/lucene/TestAnalysis.java uses or overrides a deprecated API.
  12. [javac] Note: Recompile with -Xlint:deprecation for details.
  13. jarwithout:
  14. [jar] Building jar: /home/search/LuceneDemo/myjob.jar
  15. BUILD SUCCESSFUL
  16. Total time: 1 second
  17. [search@fsedump03sand LuceneDemo]$ ll
  18. total 44
  19. drwxrwxr-x 3 search search 4096 Nov 13 18:01 bin
  20. -rw-rw-r-- 1 search search 3514 Nov 13 15:30 build.xml
  21. drwxrwxr-x 2 search search 4096 Nov 13 15:45 conf
  22. -rw-rw-r-- 1 search search 256 Nov 13 15:45 error_log
  23. -rw-rw-r-- 1 search search 1628 Nov 13 15:45 index_log
  24. drwxrwxr-x 2 search search 4096 Nov 13 15:36 lib
  25. -rw-rw-r-- 1 search search 10407 Nov 13 18:01 myjob.jar
  26. -rw-rw-r-- 1 search search 364 Nov 13 15:43 sme.sh
  27. drwxrwxr-x 3 search search 4096 Nov 13 15:31 src
  28. [search@fsedump03sand LuceneDemo]$

[b][color=green][size=large]然后我们的脚本里面如何定义的,因为我们的myjob.jar里面没有任何有关依赖的jar包,和conf配置文件,所以需要在启动时,使用cp命令动态传入,脚本如下所示:[/size][/color][/b]

  1. [search@fsedump03sand LuceneDemo]$ cat sme.sh
  2. #定义根路径
  3. cs='.:'
  4. cdir=`pwd`
  5. #echo $cdir
  6. #libpath="$cdir/lucenedemo/lib/lucenelib/"
  7. #依赖的jar包
  8. libpath="/home/search/lucenedemo/lib/lucenelib/"
  9. #echo $libpath
  10. #获取依赖jar的目录,本例只有一个依赖jar,
  11. #如果有多个,可以都拼接上即可
  12. FILES=`ls $libpath`
  13. for txt in $FILES;do
  14. cs=$cs$libpath$txt: #注意最后有个冒号拼接jar
  15. done
  16. #echo $cs
  17. #配置文件的目录
  18. conf="conf:"
  19. #自身的jar,注意$cs命令一定要放在首位
  20. cs=$cs$conf"myjob.jar"
  21. #echo $cs
  22. java -Xms128m -Xmx1024m -cp $cs com.study.lucene.TestAnalysis $1
  23. [search@fsedump03sand LuceneDemo]$

[b][color=green][size=large]执行效果如下所示:[/size][/color][/b]

  1. [search@fsedump03sand LuceneDemo]$ sh sme.sh
  2. [search@fsedump03sand LuceneDemo]$
  3. [search@fsedump03sand LuceneDemo]$ sh sme.sh bbc
  4. bbc
  5. [search@fsedump03sand LuceneDemo]$

[b][color=green][size=large]而且,我们可以改动conf里面的log4j文件,再次启动时,会立刻生效,比如散仙打开了stdout控制台输出信息:[/size][/color][/b]

  1. [search@fsedump03sand LuceneDemo]$ sh sme.sh
  2. 11-13 18:25:27.784[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc
  3. 11-13 18:25:27.789[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前你
  4. 11-13 18:25:27.790[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc
  5. 11-13 18:25:27.791[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前没
  6. 11-13 18:25:27.792[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc
  7. 11-13 18:25:27.793[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前有
  8. 11-13 18:25:27.794[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc
  9. 11-13 18:25:27.795[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前输
  10. 11-13 18:25:27.796[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc
  11. 11-13 18:25:27.797[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前入
  12. 11-13 18:25:27.798[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc
  13. 11-13 18:25:27.799[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前任
  14. 11-13 18:25:27.800[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc
  15. 11-13 18:25:27.801[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前何
  16. 11-13 18:25:27.802[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc
  17. 11-13 18:25:27.803[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前内
  18. 11-13 18:25:27.804[TestAnalysis.java :WARN :com.study.lucene.TestAnalysis.main(TestAnalysis.java:41)] abc
  19. 11-13 18:25:27.805[TestAnalysis.java :INFO :com.study.lucene.TestAnalysis.main(TestAnalysis.java:42)] 当前容
  20. 11-13 18:25:27.806[TestAnalysis.java :ERROR:com.study.lucene.TestAnalysis.main(TestAnalysis.java:46)] erro人错误
  21. [search@fsedump03sand LuceneDemo]$

[b][color=green][size=large]这样以来,我们的配置就非常灵活,任何依赖的jar包和配置文件,都可以放在项目以外的位置,不提供强依赖,必要时候,可以使用-cp加载。

最后需要注意的是,在linux上配置环境变量,注意export的方式:

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

  1. HADOOP_HOME=/home/search/hadoop
  2. PATH=$PATH:$HOME/bin:$HADOOP_HOME/bin
  3. export PATH
  4. export LUCENE_HOME=/home/search/lucenedemo/lib/lucenelib/
  5. PATH=$PATH:$LUCENE_HOME
  6. export PATH

发表评论

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

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

相关阅读

    相关 使用Ant打包Apk

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