前些天和同事交流,他说ant非常好用,他一直在用,学习资料共享后。这几天研究了一下,还真是不错,这里感谢河东的分享。
之前做过一个java的后台项目需要引入很多jar包,先是用fatjar的方式,将整个工程打成一个jar包进行发布的,一旦修改又要重新打包,上传服务器,费时费力。后来研究了一下MANIFEST.MF文件,可以将引用jar配置到这个文件里,虽然是成功了,但MANIFEST.MF的配置太过麻烦,格式要求过于严格。为此我还专门写了一段生成MANIFEST.MF的代码(见之前的文章MANIFEST.MF的应用以及如何读取jar包外的log4j.properties)。下面我们一步一步用ant来构建发布包。
ant的安装略过,apache网站上下载zip包后直接解压即可。本示例使用的是1.7.0版本。
1、示例工程的结构如下:
2、建立build.xml文件:
3、打开build.xml,输入如下内容
<?xml version="1.0" ?> <project name="hlj_task Buildfile" default="compile" basedir="."> <!-- 源文件路径 --> <property name="src.dir" value="src" /> <property name="lib.dir" value="lib" /> <property name="config.dir" value="config" /> <!-- build路径 --> <property name="build.dir" value="build" /> <property name="build.classes" value="${build.dir}/classes" /> <property name="build.lib" value="${build.dir}/lib" /> <property name="build.config" value="${build.dir}/config" /> <property name="build.bin" value="${build.dir}/bin" /> <!-- jar里MANIFEST.MF文件的属性 --> <property name="jar.name" value="hlj_task.jar" /> <property name="jar.MainClass" value="com.boco.main.Main" /> <property name="jar.buildby" value="Shen XueLiang" /> <!-- 创建build文件夹 --> <target name="prepare"> <mkdir dir="${build.dir}" /> <mkdir dir="${build.classes}" /> <mkdir dir="${build.lib}" /> <mkdir dir="${build.config}" /> <mkdir dir="${build.bin}" /> </target> <target name="clean" description="Removes all generated files."> <delete dir="${build.dir}" /> </target> <target name="delclass" description="Removes all classes files."> <delete dir="${build.dir}/classes" /> </target> <path id="classpath"> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> </fileset> </path> <target name="compile" depends="prepare" description="Compiles all source code."> <javac srcdir="${src.dir}" destdir="${build.classes}"> <classpath refid="classpath" /> </javac> </target> <target name="copyjar"> <copy todir="${build.lib}"> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> </fileset> </copy> </target> <target name="copyconf"> <copy todir="${build.config}"> <fileset dir="${config.dir}"> <include name="*.*"/> </fileset> </copy> </target> <!-- MANIFEST.MF文件的Class-Path属性 --> <manifestclasspath property="jar.classpath" jarfile="${src.dir}/${jar.name}"><!-- 可执行jar文件的路径,jar文件可以不存在,但${src.dir}必须存在 --> <classpath> <fileset dir="${lib.dir}"><!-- 依赖jar所在路径 --> <include name="**/*.jar"/> </fileset> </classpath> </manifestclasspath> <target name="jar" depends="compile,copyjar,copyconf"> <jar jarfile="${build.bin}/${jar.name}" basedir="${build.classes}"> <manifest> <attribute name="Built-By" value="${jar.buildby}" /> <attribute name="Main-Class" value="${jar.MainClass}" /> <attribute name="Class-Path" value="${jar.classpath}" /> </manifest> </jar> </target> <!-- jar包制作完成后,删除classes文件夹 --> <target name="all" depends="clean,jar,delclass" description="Cleans,compiles,then builds the JAR file." /> </project>
4、打开cmd窗口,进入工程路径,输入ant all
5、ant完成后,build文件夹的结构:
6、hlj_task.jar文件里,MANIFEST.MF的文件内容:
这样我们部署的时候,只要把build目录下的所有文件copy到服务器,然后在bin目录下启动hlj_task.jar就可以了。如果
有更新,我们只需要替换更新的jar即可。