zoukankan      html  css  js  c++  java
  • jar MANIFEST.MF 汇总



    Manifest-Version: 1.0
    Created-By: Apache Ant 1.5.1
    Extension-Name: Struts Framework
    Specification-Title: Struts Framework
    Specification-Vendor: Apache Software Foundation
    Specification-Version: 1.1
    Implementation-Title: Struts Framework
    Implementation-Vendor: Apache Software Foundation
    Implementation-Vendor-Id: org.apache
    Implementation-Version: 1.1
    Class-Path:  commons-beanutils.jar commons-collections.jar commons-dig
     ester.jar commons-logging.jar commons-validator.jar jakarta-oro.jar s
     truts-legacy.jar

    如果我们把MANIFEST中的配置信息进行分类,可以归纳出下面几个大类:

    一. 一般属性

    1. Manifest-Version
     用来定义manifest文件的版本,例如:Manifest-Version: 1.0
    2. Created-By
     声明该文件的生成者,一般该属性是由jar命令行工具生成的,例如:Created-By: Apache Ant 1.5.1
    3. Signature-Version
     定义jar文件的签名版本
    4. Class-Path
     应用程序或者类装载器使用该值来构建内部的类搜索路径

    二. 应用程序相关属性

    1. Main-Class
     定义jar文件的入口类,该类必须是一个可执行的类,一旦定义了该属性即可通过 java -jar x.jar来运行该jar文件。
     
    三. 小程序(Applet)相关属性

    1. Extendsion-List
     该属性指定了小程序需要的扩展信息列表,列表中的每个名字对应以下的属性
    2. <extension>-Extension-Name
    3. <extension>-Specification-Version
    4. <extension>-Implementation-Version
    5. <extension>-Implementation-Vendor-Id
    5. <extension>-Implementation-URL

    四. 扩展标识属性

    1. Extension-Name
     该属性定义了jar文件的标识,例如Extension-Name: Struts Framework
     
    五. 包扩展属性
     
    1. Implementation-Title   定义了扩展实现的标题
    2. Implementation-Version   定义扩展实现的版本
    3. Implementation-Vendor   定义扩展实现的组织  
    4. Implementation-Vendor-Id   定义扩展实现的组织的标识
    5. Implementation-URL :   定义该扩展包的下载地址(URL)
    6. Specification-Title   定义扩展规范的标题
    7. Specification-Version   定义扩展规范的版本
    8. Specification-Vendor   声明了维护该规范的组织
    9. Sealed   定义jar文件是否封存,值可以是true或者false (这点我还不是很理解)

    六. 签名相关属性

    签名方面的属性我们可以来参照JavaMail所提供的mail.jar中的一段

    Name: javax/mail/Address.class
    Digest-Algorithms: SHA MD5 
    SHA-Digest: AjR7RqnN//cdYGouxbd06mSVfI4=
    MD5-Digest: ZnTIQ2aQAtSNIOWXI1pQpw==

    这段内容定义类签名的类名、计算摘要的算法名以及对应的摘要内容(使用BASE方法进行编码)

    七.自定义属性

    除了前面提到的一些属性外,你也可以在MANIFEST.MF中增加自己的属性以及响应的值,例如J2ME程序jar包中就可能包含着如下信息

    MicroEdition-Configuration: CLDC-1.0
    MIDlet-Name: J2ME_MOBBER Midlet Suite
    MIDlet-Info-URL: http://www.javayou.com
    MIDlet-Icon: /icon.png
    MIDlet-Vendor: Midlet Suite Vendor
    MIDlet-1: mobber,/icon.png,mobber
    MIDlet-Version: 1.0.0
    MicroEdition-Profile: MIDP-1.0
    MIDlet-Description: Communicator

    关 键在于我们怎么来读取这些信息呢?其实很简单,JDK给我们提供了用于处理这些信息的API,详细的信息请见java.util.jar包中,我们可以通 过给JarFile传递一个jar文件的路径,然后调用JarFile的getManifest方法来获取Manifest信息。

    ----------------------------------------------------------------------------------------------

    今天在制作可执行jar文件,我生成的jar文件是hello.jar,在MANIFEST.MF中增加Main-Class属性,在写主类的时候,碰到了路径表示。
    尝试了下,如下方式一和方式二都是正确的:
    方式一:
    Main-Class: com.Test
    或者方式二:
    Main-Class: com/Test

    用如上方式一或者方式二表示,生成hello.jar包后,用java -jar hello.jar可以执行成功。


    而如下这种表示方式是错误的,方式三:
    Main-Class: comTest

    按照方式三写的话,用java -jar hello.jar,会报   错误: 找不到或无法加载主类 comTest

    ----------------------------------------------------------------------------------------------

    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文件名中要对特定的字符使用逃逸符,比如空格,要表示成" ",在路径的表示中,都采用“/” 来分隔目录(),无论是在什么操作系统中,(即使在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 要以 / 结尾

  • 相关阅读:
    Django-中间件
    Django-cookie与session
    Django-用户认证组件
    Django-forms组件
    Django-forms校验
    Django-ajax上传文件(request数据都可以在,request.body中找到)
    Django-Ajax传递json数据
    form表单文件上传
    Django-ROM(字段,参数)
    Django-模板的继承(母版,include)
  • 原文地址:https://www.cnblogs.com/suanec/p/4820461.html
Copyright © 2011-2022 走看看