MANIFEST.INF!JAR规范中 META-INF 目录中内容心得。顺带整理了网上资料,提供地址

本文深入探讨了Java产品打包为JAR文件时,MANIFEST.MF文件中各关键项的含义与配置方法,包括但不限于Manifest-Version、Ant-Version、Created-By、Extension-Name、Name、Comment等标准规范及其应用实例。

Java 产品打包成 JAR 文件,其中会在 META-INF 目录下边存在声明文件 MANIFEST.MF 。此文件内容为

KEY: VALUE ,这样的一行行内容。以下整理总结了各种标准规范中指定的 KEY 含义。


Manifest-Version
    必有,但应该不用指定
Ant-Version
    如果使用 Ant 的话,会由 Ant 自己加进来
Created-By: 1.6.0-b105 (Sun Microsystems Inc.)
    如果使用 Ant 的话,会自动增加一个 Sun 的版本
Built-By
    编译的人名,最好能是英文吧……
Extension-Name
    Jar文件的标识。如果 Java 程序包符合规范的话,包(package)名应该符合这样的规则。
    域名反序.项目名甲.模块名甲.xxx
    比如一个完整类全名:cn.spads.soccerms.data.dao.RamMatchDao
    如果是一个模块封装成 .jar 的话,会存在其它任何 .jar 包都绝不可能出现这样的包:
    cn.spads.soccerms.data.*
    于是,可以认为 cn.spads.soccerms.data 是当下这个 .jar 包所独有的 Java 类包名前缀。
    于是用词作为 .jar 文件的唯一标识,非常合适。
Name
    签名用的“姓名”,推荐将产品名称放在这里,或者是产品模块的名称。
Comment
    注释,对产品的说明
SpecificationImplementation
    Specification 是标准。比如 Servlet 标准,可能还有 JDBC 标准。
    Implementation 是针对这个标准的产品。
    如果没有特别的名字,其中 -Title 可以用和 Name 一致的内容,比如 Spads Soccer Management
    具体来说,有通用的 Title, VersionVendor
    还有 Implementation-Vendor-IdImplementation-URL
Sealed

    只有 true 和 false 二种值。
    其中 true 意味着此 .jar 包拒绝别的 .jar 包里边的程序直接加载当前 .jar 包里边的类。
    对于组件型 .jar 包,应该是 false ;对于封装的 Java 应用,可以考虑用 true 。
Class-Path
    每个类路径用空格分隔,同时换行的话要以空格作为行首第一个字符。
    此类路径的基准是当前 .jar 文件所在目录。类路径应该是以此为基准的相对路径。
    比如存在文件结构:
    SoccerMS [目录]
        soccer-ms-1.1.0.jar
        lib [目录]
            mysql-connector-java-5.1.18-bin.jar
            postgresql-9.1-901.jdbc4.jar
    那么 soccer-ms-1.1.0.jar 中 MANIFEST.MF
Main-Class
    一定要写类全名。此类中应包含 static public void main(String[] xxx) 方法,即主方法。
    然后可以通过命令行的 java -jar xxxx.jar 来运行 .jar 文件。


实际操作中,一个 .jar 包很可能实现了很多规范。于是 MANIFEST.MF 会有如下集中的段落:
############ 第 1 份规范 ###########
Specification-Title: Java API for XML Processing
Specification-Vendor: Sun Microsystems Inc.
Specification-Version: 1.3

Name: org/apache/xalan/
Comment: Main Xalan engine implementing TrAX/JAXP
Implementation-Title: org.apache.xalan
Implementation-Version: @impl.version@
Implementation-Vendor: Apache Software Foundation
Implementation-URL: http://xml.apache.org/xalan-j/

Name: org/apache/xpath/
Comment: XPath engine
Implementation-Title: org.apache.xpath
Implementation-Version: @impl.version@
Implementation-Vendor: Apache Software Foundation
Implementation-URL: http://xml.apache.org/xalan-j/

############ 第 2 份规范 ###########
Specification-Title: Runtime component of JCup
Specification-Vendor: Princeton University
Specification-Version: 0.10k

Name: java_cup/runtime/
Comment: Runtime component of JCup
Implementation-Title: runtime
Implementation-Version: @impl.version@
Implementation-Vendor: Princeton University
Implementation-URL: http://www.cs.princeton.edu/~appel/modern/java/CUP/ 



对于多段规范被实现,每个规范被多个部分联合实现,可以参看下边的例子,是一个很完整的例子。
http://www.oschina.net/code/explore/xalan/xalan-j_2_7_1/src/MANIFEST.MF


另外可以去看看以下这篇帖子,其中讲到了手动编写 MANIFEST.MF 文件的一些心得。
http://hi.baidu.com/lkdlhw_2000/blog/item/195519663df40920aa184ceb.html

这篇帖子在网上广泛流传,为防止地址打不开,给几个格式比较好的转载:
http://happysky.iteye.com/blog/391610
http://blog.163.com/shucker_gzb/blog/static/64514485200951815712456/
在 Windows 环境中执行 `jar xf Demo.jar META-INF/MANIFEST.MF` 后仍然找不到 `META-INF\MANIFEST.MF` 文件,可能涉及以下几个原因: ### 1. JAR 文件中不MANIFEST.MF 某些 JAR 文件可能没有显式定义 `MANIFEST.MF`,或者其内容被压缩或打时遗漏。这种情况下,即使执行提取命令也不会生成该文件。可以通过 `jar tf Demo.jar` 命令检查 JAR 文件中是否含 `META-INF/MANIFEST.MF` [^3]。 ### 2. 路径格式问题 在 Windows 命令行中,路径分隔符使用反斜杠 `\`,而 `jar` 命令内部使用正斜杠 `/`。虽然多数情况下系统会自动转换路径,但手动输入时仍需注意格式是否正确。例如,应使用 `META-INF/MANIFEST.MF` 而不是 `META-INF\MANIFEST.MF` [^3]。 ### 3. 提取路径问题 执行 `jar xf Demo.jar META-INF/MANIFEST.MF` 命令时,系统会将文件提取到当前工作目录下的 `META-INF` 文件夹中。如果当前目录下不存在该文件夹,系统不会自动创建,因此可能导致文件未被正确提取。建议先手动创建 `META-INF` 文件夹,再执行命令 [^3]。 ### 4. 文件被覆盖或隐藏 某些情况下,提取的文件可能已被其他文件覆盖,或者由于文件系统设置导致文件被隐藏。可以通过 `dir /a` 命令查看是否含隐藏文件,并确认是否存在 `MANIFEST.MF`。 ### 5. JAR 文件损坏或格式异常 如果 JAR 文件本身损坏或未按照标准格式打,可能导致无法正确提取 `MANIFEST.MF`。可以通过 `jar tf Demo.jar` 检查是否能正常列出内容。若命令报错或返回异常信息,则说明 JAR 文件可能存在问题 [^3]。 --- ### 示例:验证 MANIFEST.MF 是否存在 ```bash jar tf Demo.jar | findstr /i "MANIFEST" ``` 该命令可以过滤出 JAR 文件中与 `MANIFEST` 相关的条目,确认是否存在 `META-INF/MANIFEST.MF`。 --- ### 示例:手动创建目录并提取 MANIFEST.MF ```bash mkdir META-INF jar xf Demo.jar META-INF/MANIFEST.MF type META-INF\MANIFEST.MF ``` 上述命令确保在提取前已创建目标目录,避免因路径问题导致文件未被提取 [^3]。 --- ### 总结 执行 `jar xf Demo.jar META-INF/MANIFEST.MF` 后无法找到文件,可能由于 JAR 文件中缺失该文件、路径格式错误、目标目录未创建、文件被隐藏或 JAR 文件损坏等原因导致。建议通过 `jar tf` 验证文件是否存在,并确保路径格式正确及目标目录已创建。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值