打包成jar有很多方式,直接命令,使用eclipse
但这些方式在使用到第三方包的时候都不是很方便,尤其对于MANIFEST.MF格式难以手写,经常出错,相当不方便
此时可以使用ant来完成这些工作
1. Manifest-Version、Main-Class和Class-Path后面跟着一个英文的冒号,冒号后面必须跟着一个空格,然后才是版本号、类和ClassPath。
2. Class-Path中的各项应使用空格分隔,不是逗号或分号。
3. Class-Path中如果有很多项,写成一行打包的时候会报错line too long,这时需要把Class-Path分多行写。注意:从第二行开始,必须以两个空格开头,三个以上我没试过,不过不用空格开头和一个空格开头都是不行的,我已经试过了。
4. Class-Path写完之后最后一定要有一个空行。
5. jar包内有些配置文件想放在jar包外面,比如文件config.properties:如果这个文件是以路径方式载入的,比如new file("./config/config.properties"),那么将config.properties放在jar包相同目录下的 config目录下即可,也就是说“./”路径等价于jar包所在目录;如果这个文件是以ClassPath下的文件这种方式载入的,比如在Spring 中载入classpath:config.properties,则在MF文件的配置文件的ClassPath中添加“./”,然后将这个配置文件与 jar包放在同一个目录即可,当然也可以在MF文件的配置文件的ClassPath中添加“./config/”,然后把配置文件都放在jar包相同目录下的config目录下。
第一步,定义一些属性
1 <!-- name of the output .jar file -->
3 <!-- base directory for distribution target -->
4 < property name ="dist.home" value ="dist" />
5 <!-- base directory for compilation targets -->
6 < property name ="build.home" value ="target" />
7 <!-- The base directory for all libraries (jar) files -->
8 < property name ="lib.home" value ="lib" />
9
第二步,创建主程序的jar文件,这里会创建Class-Path的属性,并生成相应的MANIFEST.MF
2
3
4
5 <!-- create a property containing all .jar files, prefix lib/, and seperated with a space -->
6
7 < pathconvert property ="libs.project" pathsep =" " >
8
9 < mapper >
10
11 < chainedmapper >
12 <!-- remove absolute path -->
13 < flattenmapper />
14 <!-- add lib/ prefix -->
15 < globmapper from ="*" to ="lib/*" />
16 </ chainedmapper >
17 </ mapper >
18 < path >
19 <!-- lib.home contains all jar files, in several subdirectories -->
20 < fileset dir ="${lib.home}" >
21 < include name ="**/*.jar" />
22 </ fileset >
23 </ path >
24 </ pathconvert >
25 <!-- create the jar -->
26 < jar jarfile ="${build.home}/${jar.name}" basedir ="${build.home}/classes" >
27 <!-- define MANIFEST.MF -->
28 < manifest >
29 < attribute name ="Built-By" value ="${user.name}" />
30 < attribute name ="Main-Class" value ="my.path.to.the.main.Application" />
31 < section name ="common" >
32 < attribute name ="Specification-Title" value ="${component.name}" />
33 < attribute name ="Specification-Version" value ="${component.version}" />
34 < attribute name ="Specification-Vendor" value ="${component.vendor}" />
35 < attribute name ="Implementation-Title" value ="${component.name}" />
36 < attribute name ="Implementation-Version" value="${component.version} ${TODAY}" />
37 < attribute name ="Implementation-Vendor" value ="${component.vendor}" />
38 </ section >
39 <!-- finally, use the magically generated libs path -->
40 < attribute name ="Class-Path" value ="${libs.project}" />
41 </ manifest >
42 </ jar >
43 </ target >
44
第三步,执行主程序,在控制台中输入 java -jar 主程序.jar -Xms128M -Xmx256m.在这里我们就不用一一输入主程序引用的第三方包了,我们已经在主程序jar中的MANIFEST.MF文件中定义了Class- Path属性,这里列出了所有的第三方包.