`
sswh
  • 浏览: 163697 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

转载:关于manifest文件内的说明

    博客分类:
  • java
 
阅读更多

以下转自Jdon,以备忘。http://www.jdon.com/15361

 

学习使用 Manifest

简化Java应用程序的打包和发布 
发布Java应用程序时你会感到困难?好在Java提供了一系列打包和发布工具,可以显著的简化发布过程 
该文章提供了打包Java code的几种方法,我们将会探讨Java manifest 文件,给出用于管理JAR文件所依赖文件、估计跨平台发布所需的CLasspath的合适方法.我也会解释如何使用manifest包版本特性来确认包的兼容性...

什么是JAR文件? 

在开发过程中,我们可以直接使用Java class文件来运行程序,但这并不是一个好方式,好在Java 提供了 JAR(Java Archive)文件来提供发布和运行。 

jar 文件实际上是class 文件的ZIP压缩存档,这种格式被广泛使用,因此易与使用,有很多中工具可以操作这种格式的文件。也正是因为这个原因,jar文件本身并不能表达所包含应用程序的标签信息。 

Manifest 因此得以出现 

为了要提供存档的标签信息,jar 文件指定了一个特定目录来存放标签信息:META-INF 目录,其中我们来关注该目录中的MANIFEST.MF文件,他就是JAR的manifest文件,他包含了JAR文件的内容描述,并在运行时向JVM提供应用程序的信息,大多数JAR文件含有一个默认生成的manifest 文件,执行JAR命令或使用zip工具,都可以产生它 

如果是由jar命令产生的 manifest 文件,形如: 

Manifest-Version: 1.0 
Created-By:1.4.0-beta 
(Sun Microsystems Inc.) 

这些信息没甚么用,仅仅告诉我们使用的是1.0的manifest文件,第一行定义manifest的格式,第二行说明使用 SUN 的JDK1.4的jar工具生成该文件,如果manifest文件是由其他 (如ant) 创建的,那将会出现 “Created-By: Ant 1.2” 之类的内容,如果你是自己创建manifest文件,你可以加入自己的一些相关信息. 

基础格式 

manifest 文件的格式 是很简单的,每一行都是 名-值 对应的:属性名开头,接着是 ":" ,然后是属性值,每行最多72个字符,如果需要增加,你可以在下一行续行,续行以空格开头,以空格开头的行都会被视为前一行的续行。 

所有在开头的属性都是全局的,你也可以定义特定class 或package的属性,稍后将介绍这种 

把manifest文件插入JAR文件 

使用 m 选项,把指定文件名的manifest文件 传入,例如 

jar cvfm myapplication.jar myapplication.mf -C classdir 

如果你使用ant来创建时,在ant 的build.xml 加入如下条目 

<target name="jar"> 
<jar jarfile ="myapplication.jar" 
manifest="myapplication.mf"> 
<fileset dir="classdir" 
includes="**/*.class"/> 
</jar> 
</target> 

运行Java程序 

现在我们来体验一下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 要以 / 结尾 

mag.javadigest.net 编译 英文原文 

翻译 yife

 

分享到:
评论

相关推荐

    MANIFEST文件配置

    ### MANIFEST 文件配置详解 #### 一、MANIFEST 文件概览 **MANIFEST** 文件是 Java 归档文件 (JAR, Java Archive) 中的重要组成部分,它存储了 JAR 文件的相关元数据信息。MANIFEST 文件通常命名为 `manifest.mf`...

    Java程序创建Manifest文件

    当我们需要运行一个与其他jar文件有关联jar文件时,如果jar文件里面的MANIFEST.MF文件没有配置好,那在运行时就要报异常:Exception in thread "main" java.lang.NoClassDefFoundError。原因:未找到关联jar文件里面...

    MANIFEST.MF 文件内容详解(转)

    标题中的"MANIFEST.MF 文件内容详解(转)"是指一篇关于理解Java应用程序的MANIFEST.MF文件的文章。MANIFEST.MF文件是Java档案(JAR)文件格式的一部分,它包含了有关JAR文件元数据的重要信息。这篇博文可能是从其他...

    利用HTML5的manifest文件做缓存

    `manifest`文件是一个简单的文本文件,通常以`.appcache`为扩展名,用于定义应用所需的静态资源列表。以下是一个基本的`manifest`文件示例: ``` CACHE MANIFEST # 版本号,便于更新检测 # 主文件 index.html main...

    详解MANIFEST.MF文件

    ### 详解 MANIFEST.MF 文件 #### 概述 在Java开发中,MANIFEST.MF文件扮演着极其重要的角色,特别是在构建JAR文件时。它不仅记录了JAR包的基本元数据,还提供了运行时所需的配置信息。本文将详细介绍MANIFEST.MF...

    清单文件.manifest

    文件名“manifest-test”可能是指用于测试不同权限级别的多个版本的清单文件,或者是一个包含相关测试脚本或说明的文件。 总之,清单文件对于管理应用程序的权限和依赖关系至关重要。在VS2005和SDK V2.0的环境中,...

    VB6实现XP风格 MANIFEST文件

    VB6实现XP风格 MANIFEST文件

    安卓反解manifest文件

    总的来说,安卓反解manifest文件是Android应用分析过程中的一个重要环节,通过这个过程,我们可以获取到关于应用的结构、功能和权限需求的关键信息,这对于开发者、安全研究人员以及普通用户都有其价值。

    使VC6可以实现xp风格的manifest文件

    xpStyle.manifest 用记事本或其它文本编辑工具手动修改工程目录下的资源文件(.rc),在文件最后加上一行: 1 24 "XPStyle.manifest" 编译即可

    windows下用mt将manifest文件压缩进exe文件

    windows下用mt将manifest文件压缩进exe文件,能够让经典win2000时代界面的exe变成xp以上操作..."vb6com.exe",就让你新exe有新风格,注意你的exe文件名改变,请及时改变manifest文件名和manifest文件内包含的vb6com字样

    manifest_exe

    标题"manifest_exe"提示我们这里讨论的是关于可执行文件(exe)与manifest文件的关系,特别是如何通过manifest使得exe程序获取到root权限。我们将深入探讨manifest文件的作用、原理以及如何在Windows系统中使用它来...

    解决VC6无法指定manifest文件,调用msvcr90.dll出现R6034错误

    这个错误通常是由于缺少对应用程序清单(manifest)文件的支持导致的,而manifest文件对于处理Windows Vista及后续版本中的某些功能(如UIPI和DEP)至关重要。本文将深入探讨这个问题,并提供解决方案。 R6034错误...

    steam-appmanifest, 在 ~/.steam/steam/SteamApps 中,生成 appmanifest_APPID.acf 文件.zip

    steam-appmanifest, 在 ~/.steam/steam/SteamApps 中,生成 appmanifest_APPID.acf 文件 Steam AppManifest生成器这是一个简短的python 脚本,可以让 Steam 下载到下载非Linux应用程序中。注:Steam 不会运行没有...

    webextension-manifest:WebExtension manifest.json的类型声明

    import Manifest from "webextension-manifest" ; const manifest : Manifest = { manifest_version : 2 , name : "Awesome Extension" , version : "1.0.0" , } ; 每个清单密钥的类型也将导出: // docs/...

    Manifest.xml文件的作用和简单使用

    ### Manifest.xml 文件的作用和简单使用 #### 一、概述 `AndroidManifest.xml` 是 Android 应用中的核心配置文件,其主要职责在于向 Android 操作系统声明应用的各个组成部分及特性。该文件采用 XML 格式编写,...

    HTNL5+ HBuilder移动应用manifest文件配置指南

    HBuilder移动应用manifest文件配置指南涉及到的知识点包括了5+移动应用配置的各个重要方面,下面将详细介绍。 一、manifest.json文件介绍 manifest.json文件是5+移动应用的核心配置文件,它遵循W3C的webapp规范,并...

    perl-ExtUtils-Manifest-1.61-244.el7.noarch.rpm

    离线安装包,亲测可用

    Manifest生成器

    在Windows操作系统中,Manifest文件是一种XML文档,它提供了应用程序的元数据,尤其是在处理用户界面(UI)视觉样式和权限管理时。在WinXP时代,VB6(Visual Basic 6)开发的应用程序默认不支持Windows XP的 Aero ...

Global site tag (gtag.js) - Google Analytics