`
ganqing1234
  • 浏览: 168563 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Jar命令 Manifest.mf的用法

 
阅读更多

转自:

http://hi.baidu.com/echo_swjtu/blog/item/9ef30587e83ce784f703a658.html

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为 com.example.myapp.MyAppMain ,那么我们可以用以下的命令来运行 
java -classpath myapplication.jar com.example.myapp.MyAppMain 
这显然太麻烦了,现在我们来创建自己的manifest文件,如下: 
Manifest-Version: 1.0 
Created-By: JDJ example 
Main-Class: com.example.myapp.MyAppMain 
这样我们就可以使用如下的命令来运行程序了:(明显简单多了,也不会造成无谓的拼写错误) 
java -jar myapplication.jar


管理JAR的依赖资源 
很少Java应用会仅仅只有一个jar文 件,一般还需要 其他类库。比如我的应用程序用到了Sun 的 Javamail classes ,在classpath中我需要包含activation.jar 和 mail.jar,这样在运行程序时,相比上面的例子,我们要增加一些: 
java -classpath mail.jar:activation.jar -jar myapplication.jar 
在不同的操作系统中,jar包间的分隔符也不一样,在UNIX用“:”,在 window中使用 “;”,这样也不方便 
同样,我们改写我们的manifest文件,如下 
Manifest-Version: 1.0 
Created-By: JDJ example 
Main-Class: com.example.myapp.MyAppMain 
Class-Path: mail.jar activation.jar 
(加入了Class-Path: mail.jar activation.jar,用空格分隔两个jar包) 
这样我们仍然可以使用和上例中相同的命令来执行该程序: 
java -jar myapplication.jar 
Class-Path属性中包含了用空格分隔的jar文件,在这些jar文件名中要对特定的字符使用逃逸符,比如空格,要表示成"%20",在路径的表示中,都采用“/” 来分隔目录(),无论是在什么操作系统中,(即使在window中),而且这里用的是相对路径(相对于本身的JAR文 件): 
Manifest-Version: 1.0 
Created-By: JDJ example 
Main-Class: com.example.myapp.MyAppMain 
Class-Path: ext/mail.jar ext/activation.jar


Multiple Main Classes(多主类) 
还有一种Multiple Main Classes情况,如果你的应用程序可能有命令行版本 和GUI版本,或者一些不同的应用却共享很多相同的代码,这时你可能有多个Main Class,我们建议你采取这样的策略:把共享的类打成lib包,然后把不同的应用打成不同的包,分别标志主类:如下 
Manifest for myapplicationlib.jar: 
Manifest-Version: 1.0 
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: com.example.myapp.MyAppMain 

Manifest for myappadmin.jar: 
Manifest-Version: 1.0 
Created-By: JDJ example 
Class-Path: myapplicationlib.jar 
Main-Class: com.example.myapp.MyAdminTool 
在myappconsole.jar 和 myappadmin.jar的manifest文件中分别注明各自的 Main Class 
Package Versioning 
完成发布后,如果使用者想了解 ,哪些代码是谁的?目前是什么版本?使用什么版本的类库?解决的方法很多 ,manifest提供了一个较好的方法,你可以在manifest文件中描述每一个包的信息。


Java 秉承了实现说明与描述分离的原则,package 的描述 定义了package 是什么,实现说明 定义了谁提供了描述的实现,描述和实现包含 名、版本号和提供者。要得到这些信息,可以查看JVM的系统属性(使用 java.lang.System.getProperty() ) 
在manifest文件中,我可以为每个package定义描述和实现版本,声明名字,并加入描述属性和实现属性,这些属性是 
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: example.com 
Implementation-Title: com.example.myapp 
Implementation-Version: 2002-03-05-A 
Implementation-Vendor: example.com 
Package Version 查询 
在manifest文件中加入package描述后,就可以使用Java提供的java.lang.Package class进行Package 的信息查询,这里列举3个最基本的获取package object的方法 
1.Package.getPackages():返回系统中所有定义的package列表 
2.Package.getPackage(String packagename):按名返回package 
3.Class.getPackage():返回给定class所在的package 
使用者这方法就可以动态的获取package信息. 
需要注意的是如果给定的package中没有class被加载,则也无法获得package 对象

 

Manifest 技巧 
总是以Manifest-Version属性开头 
每行最长72个字符,如果超过的化,采用续行 
确认每行都以回车结束,否则改行将会被忽略 
如果Class-Path 中的存在路径,使用"/"分隔目录,与平台无关 
使用空行分隔主属性和package属性 
使用"/"而不是"."来分隔package 和class ,比如 com/example/myapp/ 
class 要以.class结尾,package 要以 / 结尾

分享到:
评论

相关推荐

    typed-manifest:对标准 Java META-INFMANIFEST.MF 的类型安全访问

    提供对类路径上META-INF/MANIFEST.MF轻松访问。 用法 请参阅samples模块。 背景故事 我正在构建一个可执行的 uberjar 并正确填充META-INF/MANIFEST.MF的Implementation-Version 。 我希望清单成为该信息的唯一真实...

    J2EE JNDI配置原理详解 JBOSS安装配置 Maven入门 Ant使用入门

    1.12 详解MANIFEST.MF文件 1.13 Maven入门--概念与实例 1.14 Subversion 1.15 jar war ear区别 1.16 如何在Eclipse中调试JBoss应用 1.17 JBoss 5.0 安装与配置详解 1.18 JBOSS安装配置 1.19 Oracle,MySql,...

    Eclipse RCP详细教程

    目 录 1.富客户端平台 1 1.1.概述 1 1.2.Eclipse RCP 建设风格——插件,扩展和扩展点 1 2.创建你的第一个RCP程序 1 ...22.3.Manifest.MF 154 23.附录:使用接口技术 154 23.2.Jface 154

    GohPackTool:适用于GohSDK的Android游戏客户端渠道打包脚本

    用法根据channel文件夹下的脚本按顺序依次进行各参数执行Jar命令即可。打不同脚本时记得修改MANIFEST.MF文件。发展游戏类增加游戏时,创建新的游戏类继承Game ,并重组抽象方法: class GameXXX ( apk : String ) : ...

    health-report:演示如何使用流API的示例程序

    jar cmf META-INF/MANIFEST.MF health-report.jar . 用法 要将运行状况报告作为Java代理运行: $ java -javaagent:health-report.jar MyApp 要针对自身运行“健康”报告: $ java Main.java 有关演示,请参见: ...

    Maven学习资料个人总结

    导致的最终结果就是,你根本无法确定JBoss中的lib下的common-logging 是哪个版本的,唯一的方法就是打开 META-INF 目录下MANIFEST.MF。估计JBoss迟早会转向Maven的。 第三:Maven是基于中央仓库的编译,即把编译...

    executable-war-example:示例Maven项目显示了如何使用自定义类加载器使Java WAR文件像JAR一样可执行

    可执行WAR文件的演示这是可执行WAR文件的演示。 它使用自定义类加载器从Web存档(WAR... JAR文件的典型位置没有MANIFEST.MF 。 它包含Main-Class条目,以表示包含main()方法的类。 此外,还有一个Bootstrap类,负责从备

    使用JDBC4.0操作Oracle中BLOB类型的数据方法

    在/META-INF/MANIFEST.MF里可以看到Specification-Version: 4.0 建表 create sequence seq_blobmodel_id start with 1 increment by 1 nocache; create table blobmodel ( blobid number(10) primary key not ...

    使用JDBC4.0处理Oracle中BLOB类型的数据

     在/META-INF/MANIFEST.MF里可以看到Specification-Version: 4.0  建表 create sequence seq_blobmodel_id start with 1 increment by 1 nocache; create table blobmodel ( blobid number(10) primary key ...

    ant1.9资源

    Ant可以代替使用javac、java和jar等命令来执行java操作,从而达到轻松的构建和部署Java工程的目的。下面来看几个知识点。 1. 利用Ant的javac任务来编译java程序 Ant的javac任务用于实现编译Java程序的功能。下面来...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

Global site tag (gtag.js) - Google Analytics