`
hitqiang
  • 浏览: 36161 次
  • 性别: Icon_minigender_1
  • 来自: shangdpng
最近访客 更多访客>>
社区版块
存档分类
最新评论

jar文件使用详解

阅读更多
式被广泛使用,因此易与使用,有很多中工具可以操作这种格式的文件。也正是因为这个原因,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文件作用:

  1、把manifest文件插入JAR文件,用来描述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

       上面的方法打包后生成的jar文件中不包括ext/mail.jar ext/activation.jar两个包,要运行生成的包,必须同时存在Class-Path中的包,且相对位置不能改变。这样运行一个包,要附带几个包,很不方便,那有什么办法让这些包都集成一个包中呢?当然可以。这里介绍一种方法:将所引用到的包全部解压到同一个目录下(当前目录切换到此目录),自己的包也在该目录下,manifest.mf文件(此时无须再包含Class-Path属性)和图片文件也放在此目录下(当前目录不包含不相关文件),然后将当前目录下所有文件打包,命令如下:

当前目录>jar cvfm my.jar manifest.mf -C ./ *

用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名

"-C ./"中"./"代表当前目录,其与后面的"*"之间有空格,"*"代表所有文件,这样就将引用的包加进来了,可以双击运行。虽然图片文件也打到包中了,但好象没有用,当存在于包外时有用。

另外,你也可以加入一些其他必要的文件:jar cvmf MANIFEST.MF a.jar *.class *.png   这样你就可以把程序中需要的一些图片文件打包到jar包中了。

但是把图片打包到jar中可能会存在这样的情况,就是不打包时还可以加载图片,打了包之后程序加载不上图片,那么你的程序需要稍微改一下,在新建图标对象的时候:

Icon pica=new ImageIcon(a.class.getResource("pica.png"));
Icon picb=new ImageIcon(a.class.getResource("picb.png"));

其中a.class是你的主类名,这样就可以加载上图片了。




  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 要以 / 结尾




  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

  2、用来描述包 Package Versioning

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

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

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

  Specification-Title

  Specification-Version

  Specification-Vendor
引用自:http://hi.baidu.com/suofang/blog/item/271e8682f943c291f603a629.html
分享到:
评论

相关推荐

    JAR文件包及jar命令详解

    Java Archive (JAR) 文件是Java程序中常用的打包格式,它...了解并掌握如何创建和使用可执行的JAR文件,对Java开发者来说至关重要。通过正确的配置和使用,JAR文件能够提供便捷的用户体验,同时保持Java的跨平台特性。

    JAR文件详解

    **JAR文件详解** JAR(Java Archive)文件是Java平台特有的文件格式,它基于流行的ZIP文件格式,用于集合多个文件成为一个单一的档案文件。JAR文件不仅用于压缩和发布,还是部署和封装库、组件以及插件程序的重要...

    JAR文件包详解,创建可执行jar

    - 使用JAR文件时,要确保目标机器上已经安装了兼容的Java运行环境(JRE)。 总之,JAR文件是Java开发中不可或缺的一部分,它提供了打包、分发和执行Java应用程序的有效方式,同时也为跨平台的软件开发提供了便利。...

    JAVA JAR 文件规范详解

    JAVA JAR 文件规范详解是对 JAR 文件格式的详细介绍, JAR 文件是基于 ZIP 文件格式的一种文件格式,用来将许多文件整合成一个文件。一个 JAR 文件本质上是包含可选目录 META‐INF 的 zip 文件,可以通过命令行 jar ...

    JAR文件包及jar命令详解.rar

    Java Archive (JAR) 文件是Java平台上的一个特殊文件格式,用于封装多个类文件、资源文件和其他相关数据。JAR文件的主要目的是为了...通过阅读“JAR文件包及jar命令详解.pdf”,你可以更深入地学习这些概念和实践操作。

    JAR文件包及jar命令详解.CHM

    JAR文件包及jar命令详解.CHM &lt;br&gt; JAR文件包及jar命令详解 常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件。通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样...

    制作可执行的JAR文件包及jar命令详解

    ### 制作可执行的JAR文件包及jar命令详解 在Java开发中,将多个类文件、资源文件以及依赖库打包成一个可执行的JAR(Java Archive)文件是常见的需求,尤其对于构建独立运行的应用程序尤为重要。本文将深入探讨如何...

    制作可执行的JAR文件包及jar命令详解.doc

    制作可执行的JAR文件包及jar命令详解 Java Archives(JAR)文件是一种Java特有的文档格式,类似于ZIP文件,但包含了一个META-INF/MANIFEST.MF文件,该文件是在生成JAR文件时自动创建的。JAR文件可以包含Java类、...

    JAR文件详解和相关实例

    ### JAR 文件详解与实践应用 #### 一、JAR 文件概述 JAR(Java Archive)文件是一种将多个 Java 类文件及其相关资源打包成单个文件的格式。它基于 ZIP 文件压缩标准,但与 ZIP 文件不同的是,JAR 文件包含了一个...

    将java文件打包成 jar jar命令详解

    ### Java 文件打包成 JAR 文件详解 #### 一、JAR 命令概述 JAR(Java Archive)是 Java 开发工具包 (JDK) 中的一个实用程序,用于将多个 Java 类文件和其他资源文件打包成一个 JAR 文件。JAR 文件不仅便于分发和...

    JAR文件读取工具

    **JAR文件读取工具详解** Java Archive (JAR) 文件是Java平台上的一个重要组成部分,它主要用于打包Java类、资源文件以及元数据。JAR文件的出现使得Java开发者能够将多个类文件组合成一个单一的可执行文件,方便...

    java 程序都编译成执行文件jar命令详解

    JAR 文件的使用能够保留 Java 的跨平台特性,因为它不依赖于特定操作系统。 **1. JAR 文件的创建** 创建 JAR 文件主要通过 Java Development Kit(JDK)提供的 `jar` 命令。例如,若有一个名为 `test` 的目录,包含...

    [精华] 制作可执行的JAR文件包及jar命令详解zt

    ### 制作可执行的JAR文件包及jar命令详解 #### 可执行JAR文件的概念与优势 在探讨如何创建可执行的JAR文件之前,我们先来了解一下什么是JAR文件以及为什么需要将Java程序打包成可执行的JAR文件。 **JAR (Java ...

    JAR命令详解

    1. **类库发布与使用**:JAR文件是发布和使用Java类库的标准方式。 2. **构建单元**:JAR文件可以用作应用程序或扩展的基础构建单元。 3. **部署单位**:对于组件、Applet或插件程序,JAR文件是重要的部署单位。 4. ...

    Jar文件包间接及Jar命令开发实例详解

    ### Jar文件包间接及Jar命令开发实例详解 #### 一、引言 在Java开发过程中,经常遇到将Java程序封装成可直接运行的文件的需求。本文将详细介绍如何使用Jar文件包以及Jar命令来实现这一目标,并通过实际示例加深理解...

Global site tag (gtag.js) - Google Analytics