Jar命令中Manifest.mf⽂件详解
1.在命令⾏中输⼊“jar -help”,就k可看到jar的详细⽤法了。
2.⽰例:
1)将两个class⽂档归档到⼀个jar⽂件中:jar -cvf XX.jar A.class B.class
2 )使⽤清单⽂件Manifest.mf将dir⽬录下的所有⽂件归档到⼀个jar中:jar -cvfm XX.jar Manifest.mf dir/*
manifest ⽂件的格式很简单,每⼀⾏都是 " 名-值 " 对应的:
属性名开头,接着是 ":" ,然后是属性值,每⾏最多72个字符,如果需要增加,你可以在下⼀⾏续⾏,续⾏以空格开头,以空格开头的⾏ 都会被视为前⼀⾏的续⾏。
使⽤ m 选项,把指定⽂件名的manifest⽂件传⼊,例如
jar cvfm myapplication.jar myapplication.mf [-C]classdir
Manifest.mf的详细⽤法(转)
现在我们来体验⼀下manifest⽂件的作⽤,如果现在我们有⼀个Java 应⽤程序打包在myapplication.jar中, main class为
java -classpath myapplication.app.MyAppMain
这显然太⿇烦了,现在我们来创建⾃⼰的manifest⽂件,如下:
Manifest-Version: 1.0
scott caanCreated-By: JDJ example
appeal toMain-Class: app.MyAppMain
这样我们就可以使⽤如下的命令来运⾏程序了:(明显简单多了,也不会造成⽆谓的拼写错误)
java -jar myapplication.jar
管理JAR的依赖资源
衡水中学英语作文字体
很少Java应⽤会仅仅只有⼀个jar⽂ 件,⼀般还需要 其他类库。⽐如我的应⽤程序⽤到了Sun 的 Javamail class ,在classpath中我需要包含activation.jar 和 mail.jar,这样在运⾏程序时,相⽐上⾯的例⼦,我们要增加⼀些:
java -classpath mail.jar:activation.jar -jar myapplication.jar
在不同的操作系统中,jar包间的分隔符也不⼀样,在UNIX⽤“:”,在 window中使⽤ “;”,这样也不⽅便
同样,我们改写我们的manifest⽂件,如下
Manifest-Version: 1.0
majoy
mpiayerCreated-By: JDJ example
Main-Class: app.MyAppMain
Class-Path: mail.jar activation.jar
(加⼊了Class-Path: mail.jar activation.jar,⽤空格分隔两个jar包)
这样我们仍然可以使⽤和上例中相同的命令来执⾏该程序:
java -jar myapplication.jar
Class-Path属性中包含了⽤空格分隔的jar⽂件,在这些jar⽂件名中要对特定的字符使⽤逃逸符,⽐如空格,要表⽰成" ",在路径的表⽰中,都采⽤“/” 来分隔⽬录(),⽆论是在什么操作系统中,(即使在window中),⽽且这⾥⽤的是相对路径(相对于本⾝的JAR⽂ 件): Manifest-Version: 1.0
Created-By: JDJ example
Main-Class: app.MyAppMain
Class-Path: ext/mail.jar ext/activation.jar
Multiple Main Class(多主类)
还有⼀种Multiple Main Class情况,如果你的应⽤程序可能有命令⾏版本 和GUI版本,或者⼀些不同的应⽤却共享很多相同的代码,这时你可能有多个Main Class,我们建议你采取这样的策略:把共享的类打成lib包,然后把不同的应⽤打成不同的包,分别标志主类:如下Manifest for myapplicationlib.jar:
Manifest-Version: 1.0
solution是什么意思
Created-By: JDJ example
Class-Path: mail.jar activation.jar
Manifest for myappconsole.jar:
Manifest-Version: 1.0
Created-By: JDJ example
Class-Path: myapplicationlib.jar
Main-Class: app.MyAppMain
Manifest for myappadmin.jar:
Manifest-Version: 1.0
Created-By: JDJ example
Class-Path: myapplicationlib.jar
Main-Class: app.MyAdminTool
在myappconsole.jar 和 myappadmin.jar的manifest⽂件中分别注明各⾃的 Main Class
Package Versioning
完成发布后,如果使⽤者想了解 ,哪些代码是谁的?⽬前是什么版本?使⽤什么版本的类库?解决的⽅法很多 ,manifest提供了⼀个较好的⽅法,你可以在manifest⽂件中描述每⼀个包的信息。
Java 秉承了实现说明与描述分离的原则,package 的描述 定义了package 是什么,实现说明 定义了谁提供了描述的实现,描述和实现包含 名、版本号和提供者。要得到这些信息,可以查看JVM的系统属性(使⽤ java.Property() )
在manifest⽂件中,我可以为每个package定义描述和实现版本,声明名字,并加⼊描述属性和实现属性,这些属性是watermelon怎么读
Specification-Title
Specification-Version
Specification-Vendor
Implementation-Title
Implementation-Version
Implementation-Vendor
当要提供⼀个类库或编程接⼝时,描述信息显得是很重要,见以下范例:
Manifest-Version: 1.0
Created-By: JDJ example
Class-Path: mail.jar activation.jar
Name: com/example/myapp/
Specification-Title: MyApp
Specification-Version: 2.4
Specification-Vendor:
Implementation-Title: app
Implementation-Version: 2002-03-05-A
翻译英文Implementation-Vendor:
Package Version 查询
在manifest⽂件中加⼊package描述后,就可以使⽤Java提供的java.lang.Package class进⾏Package 的信息查询,这⾥列举3个最基本的获取package object的⽅法
蓬蒿菜Packages():返回系统中所有定义的package列表
Package(String packagename):按名返回package
Package():返回给定class所在的package
使⽤者这⽅法就可以动态的获取package信息.
需要注意的是如果给定的package中没有class被加载,则也⽆法获得package 对象
Manifest 技巧
总是以Manifest-Version属性开头
每⾏最长72个字符,如果超过的化,采⽤续⾏
确认每⾏都以回车结束,否则改⾏将会被忽略
如果Class-Path 中的存在路径,使⽤"/"分隔⽬录,与平台⽆关
orgy
使⽤空⾏分隔主属性和package属性
使⽤"/"⽽不是"."来分隔package 和class ,⽐如 com/example/myapp/
class 要以.class结尾,package 要以 / 结尾
打包可执⾏jar包时,MANIFEST.MF总是个让⼈头疼的东西,经常出现这种那种问题。
⼀个例⼦: ================================================================================ Manifest-Version: 1.0 Main-Class: test.Main Class-Path: ./ ./lib/commons-collections-3.2.jar ./lib/commons-dbcp-1.2.2.jar ./lib/commons-lang-2.3.jar ./lib/commons-logging-1.1.jar
================================================================================ 各部分解释: Manifest-Version MF⽂件版本号 Main-Class 包含main⽅法的类 Class-Path 执⾏这个jar包时的ClassPath 以下是需要注意的各个要点: 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⽬录下。