文档章节

Java类归档文件jar里的Manifest文件详述

secondriver
 secondriver
发布于 2015/09/17 09:27
字数 1602
阅读 19
收藏 0

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

 

1.1 什么是JAR文件?

 

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

 

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

 

1.2 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文件,你可以加入自己的一些相关信息.。

 

1.3 Mainfest基础格式

 

  •  每一行都是"名-值"对应的,属性名开头,接着是 ":" ,然后是属性值

  • 每行最多72个字符,如果需要增加,你可以在下一行续行,续行以空格开头,以空格开头的行都会被视为前一行的续行。

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

  • 如果Class-Path 中的存在路径,使用"/"分隔目录,与平台无关

  • 使用空行分隔主属性和package属性

  • 总是以Manifest-Version属性开头

  • 使用"/"而不是"."来分隔package和class ,比如 com/example/myapp/

  • class要以“.class”结尾,package 要以 “/” 结尾

     

1.4 制作jar包

 

     1.4.1使用jar命令制作jar包

    

 把manifest文件插入JAR文件使用 m 选项,把指定文件名的manifest文件传入,如下操作

jar cvfm myapplication.jar myapplication.mf -C classdir

   

    1.4.1 使用ant命令制作jar包

    

通过ant命令来制作jar包,并在任务中配置manifest的信息。

<jar destfile="xxx.jar">

   <manifest>

    <attribute name="Built-By" value="由谁构建" />

    <attribute name="Main-Class" value="主类" />

     <attribute name="Specification-Title" value="包实现的规范标题" />

     <attribute name="Specification-Version" value="包实现的规范的版本号" />

     <attribute name="Specification-Vendor" value="拥有并维护实现此包的类规范的组织、供应商或公司的名称" />

     <attribute name="Implementation-Title" value="包的标题" />

     <attribute name="Implementation-Version" value="实现的版本" />

     <attribute name="Implementation-Vendor" value="提供该实现的组织、供应商或公司的名称" />

   </manifest>

   <fileset dir="${bin}">

    <include name="**/*.class" />

   </fileset>

  </jar>

 

1.5管理jar的依赖资源

 

      很少Java应用会仅仅只有一个jar文件,一般还需要其他类库。比如我的应用程序用到了Sun的Javamail classes ,在classpath中我需要包含activation.jar和 mail.jar,这样在运行的时候就需要显示的指定依赖的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

 

1.6 Package

   

     完成发布后,如果使用者想了解 ,哪些代码是谁的?目前是什么版本?使用什么版本的类库?解决的方法很多 ,manifest提供了一个较好的方法,你可以在manifest文件中描述每一个包的信息。

    

      Java 秉承了实现说明与描述分离的原则,package 的描述 定义了package 是什么,实现说明 定义了谁提供了描述的实现,描述和实现包含 名、版本号和提供者。要得到这些信息,可以查看JVM的系统属性(使用 java.lang.System.getProperty() )


     在manifest文件中,我可以为每个package定义描述和实现版本,声明名字,并加入描述属性和实现属性,这些属性可以参加1.4.1。

 

  当要提供一个类库或编程接口时,描述信息显得是很重要,见以下范例:

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 对象。

 原文出处: http://www.jdon.com/15361 博主有做删改

© 著作权归作者所有

secondriver
粉丝 10
博文 229
码字总数 233821
作品 0
广州
程序员
私信 提问
安卓(Android)开发基础知识

.aar文件 .aar是一种压缩文件,和.jar类似,不过它可以包含资源文件,例如图片、drawable、xml资源 .jar文件 在软件领域,JAR文件(Java归档,英语:Java ARchive)是一种软件包文件格式,通...

赵青青
2018/10/11
0
0
Java打包指南-JAR文件包及jar命令详解

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

roockee
2011/11/29
343
0
Maven打jar包时MANIFEST.MF文件的重要性,MANIFEST.MF文件详细介绍

打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录, 这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息。个人理解,MANIFEST.MF文件是j...

warm-Y
09/06
47
0
制作可执行的JAR文件包及jar命令详解

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

xinyitianii
2014/07/09
84
0
将Java程序作成exe文件的N种方法

使用制作可执行 JAR 文件包 下面就来看看什么是 JAR 文件包吧: a) JAR 文件包 JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式。JAR 文件...

楓楪
2014/03/13
444
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部