在Java平台中, 清单文件(Manifest file)是JAR档案中包含的特殊文件。Manifest文件被用来定义扩展或档案打包相关数据,是一个元数据文件,它包含了不同部分中的名/值对数据。如果一个JAR文件被用来作为可执行文件,那么其中的Manifest文件需要指出该程序的主类文件。通常Manifest文件的文件名为MANIFEST.MF。

JAR文件可以可选地在META-INF目录中包含名为MANIFEST.MF的Manifest文件。Manifest文件包含有关JAR文件及其条目的信息。manifest文件被分成由空白行分隔的部分。每个部分包含名称 - 值对。一个新行分隔每个名称/值对。冒号分隔名称及其对应的值。
清单文件必须以新行结束

以下是一个META-INF.MF清单文件

Manifest-Version: 1.0
Class-Path: . cmd_lib/commons-lang3-3.7.jar
Main-Class: com.yveshe.PackageClass
Name: java/util/
Specification-Title: "Java Utility Classes"
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems, Inc.".
Implementation-Title: "java.util"
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems, Inc."

一般属性介绍

Manifest-Version:
用来定义manifest文件的版本,例如:Manifest-Version: 1.0

Main-Class
定义jar文件的入口类,该类必须是一个可执行的类(包含main方法的类),一旦定义了该属性即可通过 java -jar x.jar来运行该jar文件。
运行Jar: java -jar yveshe.jar
当运行上述命令时JVM将在yveshe.jar文件中的MANIFEST.MF文件中查找Main-Class属性的值,并尝试运行该类。如果在yveshe.jar文件中未包含Main-Class属性,则上述命令将生成错误。

Class-Path:
指定jar包的依赖关系,class loader会依据这个路径来搜索class.默认是相对路径,相对该jar所在的父文件夹.
可以在其manifest 文件中为JAR文件设置CLASSPATH。属性名称叫作类路径,必须在自定义清单文件中指定。 它是一个空格分隔的jar文件,zip文件和目录的列表。(不区分系统都是以空格来分隔多个jar文件)以下是一个属性配置例子:
Class-Path: reference1.jar file:/c:/book/ http://www.yveshe.com/reference2.jar
这条命令配置了该yveshe.jar依赖了三个jar:
一个JAR文件reference1.jar,一个使用文件协议文件的目录:c:/book/和另一个使用HTTP协议的JAR文件http://www.yveshe.com/reference2.jar
注意: 当使用java命令使用-jar(比如java -jar yveshe.jar)选项运行JAR文件时,将忽略Jar中 manifest文件之外的任何CLASSPATH设置。

Sealed:
密封 JAR 文件中的一个包意味着在这个包中定义的所有类都必须在同一个 JAR 文件中找到。这使包的作者可以增强打包类之间的版本一致性。密封还提供了防止代码篡改的手段。
要密封包,需要在 JAR 的 manifest 文件中为包添加一个 Name 头,然后加上值为“true”的 Sealed 头。与可执行的 JAR 一样,可以在创建 JAR 时,通过指定一个具有适当头元素的 manifest 文件密封一个 JAR,如下所示:
Name: com/yveshe/
Sealed: true

Name 头标识出包的相对路径名。它以一个“/”结束以与文件名区别。在 Name 头后面第一个空行之前的所有头都作用于在 Name 头中指定的文件或者包。在上述例子中,因为 Sealed 头出现在 Name 头后并且中间没有空行,所以 Sealed 头将被解释为只应用到包 com/yveshe上。如果试图从密封包所在的 JAR 文件以外的其他地方装载密封包中的一个类,那么 JVM 将抛出一个SecurityException 。文件头Name的值为该封装的相对路径名。注意,该路径名由‘/’结束以区别于文件名。

在下面的代码中Sealed仅仅作用于name: com/yveshe/意思是包com.yveshe下的代码不允许被外部类加载调用.

Manifest-Version: 1.0
Class-Path: . cmd_lib/commons-lang3-3.7.jar
Main-Class: com.yveshe.PackageClass
Name: java/util/
Specification-Title: "Java Utility Classes"
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems, Inc.".
Implementation-Title: "java.util"
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems, Inc."name: com/yveshe/
Sealed: true

书写注意:

1.每行的“:”(冒号)用来分隔键值对,冒号后边一定要跟一个空格.
2.MANIFEST.MF清单文件必须以一个空白行结束.
3.Class-Path里边的内容用空格分隔而不是逗号或者分号。
4.每行不能超过七十多的字符.

Java| MANIFEST.MF讲解相关推荐

  1. java原生和SpringBoot读取jar包中MANIFEST.MF的方式

    我们经常看到java的一些jar包META-INF目录下包含一个MANIFEST.MF文件,里面包含一些版本信息,标题,实现组织,很多第三方的jar包还会自定义一个属性. 本文讲解如何读取jar包中M ...

  2. java 读取manifest_使用JAVA从jar文件读取MANIFEST.MF文件

    我根据从计算器一些想法实现的AppVersion类,在这里我只是共享整个类: import java.io.File; import java.net.URL; import java.util.ja ...

  3. 【Java】MANIFEST.MF是什么

    1.概述 常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件.通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了:而另一种是使用 JE ...

  4. intelliJ IDE 打包出错:F:/InterlliJ IDEA/Demo/src/main/java/META-INF/MANIFEST.MF' already exists in VFS

    在多次打包guo'过程中,突然chu'出现了一个这种错误,为了以后的学习和复习,将此错误记录下来. 错误:F:/InterlliJ IDEA/Demo/src/main/java/META-INF/M ...

  5. 【JAVA】MANIFEST.MF / CERT.SF 中 文件SHA1-Digest计算方法

    前言: 给旧手机刷机,rom.zip 直接解压魔改,完后再压缩为zip刷入手机.其间遇到了 MANIFEST.MF / CERT.SF 这两个文件,看看是怎么回事吧. MANIFEST.MF Mani ...

  6. java没有manifest.mf_java - IntelliJ IDEA中错误的Manifest.mf创建.j

    java - IntelliJ IDEA中错误的Manifest.mf创建.j 我试图通过IntelliJ IDEA的jar工件将使用OptaPlanner 6.0.1库的项目打包到.jar中,而不是 ...

  7. java jar包中MANIFEST.MF中有版本信息

    有时候查看人家的源代码,但有可能该软件有很多个版本,这个时候就可以通过 MANIFEST.MF来查看当前项目引用的是哪个版本.当然了如果本身jar包名已经是用版本号来命名的.则不需要这样查看. 可以参 ...

  8. Java 打 jar 包时,MANIFEST.MF 文件详解

    具体详情,详见<MANIFEST.MF文件详解> manifest.mf 的编写规则 不能有空行和空格的地方 第一行不可以是空行(第一行的行前不可以有空行),行与行之间不能有空行,每行的行 ...

  9. MANIFEST.MF是个什么?

    MANIFEST.MF是个什么? 写这篇文件主要记录JRA文件里面到底是什么?然后MANIFEST.MF又是什么?Springboot 如何只有Main方法就可以运行的? Springboot项目打包 ...

最新文章

  1. 好程序员web前端技术分享媒体查询
  2. 正则表达式匹配不包含特定字符串解决匹配溢出问题
  3. C# 获取字符串长度 获取字符串字节长度
  4. 【每周CV论文推荐】 初学深度学习单张图像三维人脸重建需要读的文章
  5. 第二百三十一天 how can I 坚持
  6. c# websocket 心跳重连_websocket的简单使用
  7. Redis学习笔记~分布式的Pub/Sub模式
  8. python图像卷积_图像处理——卷积原理、二维卷积python实现
  9. php显示几个字符串,比较php中的两个字符串并显示字符差异
  10. android oreo_Android Oreo画中画
  11. 公式字符串转换为公式或结果
  12. python爬虫框架scrapy案例分析
  13. 如何将origin pro的界面切换变成中文显示?
  14. 产品开发之小步快跑,快速迭代
  15. 好文推荐:努力是没有用的
  16. 鼠标跟随flash代码_Flash动画设计之 MTV实例创作《不说再见》
  17. 51单片机教程(从原理开始基于汇编)
  18. 低碳世界杂志低碳世界杂志社低碳世界编辑部2022年第7期目录
  19. iOS 调试:DerekSelander【 LLDB aliases/regexes and Python scripts to aid in your debugging sessions】
  20. 戴尔服务器温度显示器,选择Dell UltraSharp 27的四大理由:有温度的科技更近人心...

热门文章

  1. 达梦数据库 开发版试用时间限制
  2. STM32CubeMX介绍、下载与安装
  3. 控制台基于Quartz.Net组件实现定时任务调度(一)
  4. 数字化营销3大趋势:全域、全链路、全闭环
  5. aspx页面返回的response
  6. 数据研究之综合评分(一) 权重-评分-指标
  7. 多CPU和多核CPU对应多进程和多线程调度
  8. 行业寒冬下,简历发了几千次已读不回,功能测试的出路在哪里?
  9. spring boot(banner在线生成)
  10. 递归函数实现二进制转换为十进制