打包成的jar可以执行需要注意的是
1、依赖外部jar包的情况下,怎么可以让我们自己写的程序找到依赖的外部jar包
2、src目录下面的一些配置文件或者资源文件我们也需要拷贝到我们的jar包中
3、MANIFEST.MF文件中Class-Path 选项可以根据我们添加jar后自动修改,而不用我们手动在后面写一大段的
繁琐代码
<!-- convert build.classpath to mf.classpath (the string needed for the manifest task) --> <pathconvert property="mf.classpath" pathsep=" "> <path refid="build.classpath" /> <flattenmapper /> </pathconvert> <!-- now build the manifest file, using mf.classpath --> <tstamp/><!-- needed for TODAY --> <manifest file="MANIFEST.MF"> <attribute name="Built-By" value="${manifest.built.by}"/> <attribute name="Created-By" value="${manifest.created.by}"/> <attribute name="Main-Class" value="${manifest.main.class}"/> <attribute name="Implementation-Version" value="${version.number}-b${build.number}"/> <attribute name="Built-Date" value="${TODAY}"/> <attribute name="Class-Path" value="${mf.classpath}" /> </manifest>
写好 MANIFEST.MF后就需要在打包的时候包含在我们的jar文件中,同时要注意依赖jar包的位置,一般我们都是放在lib目录下面。
<!-- create the jar file, including the manifest file we just created --> <jar basedir="${dest.dir.classes}" destfile="${package.file}" includes="**/*.*" excludes="**/*Test*" manifest="MANIFEST.MF" /> <!-- copy all the jar files out to the destination directory (dest.dir) --> <copy todir="${dest.dir}"> <fileset dir="${lib.dir}"> <exclude name="junit*" /> <include name="*.jar"/> <include name="*.zip"/> </fileset> </copy>
当打包完成后,我们就可以到deploy目录下面双击我们的jar包来运行了。可以看到界面(前提是你有提供界面)
打包后的目录结构:
我的界面如下
bulid.xml文件的内容
<?xml version="1.0" encoding="UTF-8"?> <project name="test" default="jar"> <!-- Name of the output .jar file --> <property name="jar.name" value="jar_name.jar" /> <!-- Base directory for distribution target --> <property name="deploy.home" value="deploy" /> <!-- Base directory for compilation targets --> <property name="build.home" value="." /> <!-- Main class --> <property name="main.class" value="com.chen.test.JTabbedPane2" /> <!-- The base directory for all libraries (jar) files --> <property name="lib.home" value="lib" /> <pathconvert property="mf.classpath" pathsep=" "> <mapper> <chainedmapper> <!-- remove absolute path --> <flattenmapper /> <!-- add lib/ prefix --> <globmapper from="*" to="lib/*" /> </chainedmapper> </mapper> <path> <!-- lib.home contains all jar files, in several subdirectories --> <fileset dir="${lib.home}"> <include name="**/*.jar" /> </fileset> </path> </pathconvert> <path id="classpath"> <fileset file="${lib.dir}" includes="**/*.jar" /> </path> <target name="compile"> <mkdir dir="${deploy.home}/classes"/> <copydir dest="${deploy.home}/classes" src="resources"></copydir> <copy todir="${deploy.home}/classes"> <fileset dir="src"> <exclude name="**/*.java"/> <include name="**/*.*"/> </fileset> </copy> <javac destdir="${deploy.home}/classes" classpathref="classpath" encoding="UTF-8"> <src path="src"/> <src path="resources"/> </javac> </target> <!-- Next, my package task uses that classpath --> <target name="jar" depends="compile"> <!-- now build the manifest file, using mf.classpath --> <tstamp/><!-- needed for TODAY --> <manifest file="MANIFEST.MF"> <attribute name="Main-Class" value="${main.class}"/> <attribute name="Built-Date" value="${TODAY}"/> <attribute name="Class-Path" value="${mf.classpath}" /> </manifest> <!-- create the jar file, including the manifest file we just created --> <mkdir dir="${deploy.home}/lib"/> <jar basedir="${deploy.home}/classes" destfile="${deploy.home}/${jar.name}" includes="**/*.*" manifest="MANIFEST.MF" /> <!-- copy all the jar files out to the destination directory (dest.dir) --> <copy todir="${deploy.home}/lib"> <fileset dir="${lib.home}"> <exclude name="junit*" /> <include name="*.jar"/> <include name="*.zip"/> </fileset> </copy> <delete dir="${deploy.home}/classes" /> </target> </project>