`

制作jar包

阅读更多
  发布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 要以 / 结尾

另一篇文章:
打包程序为 JAR 可执行文件:

      并不是所有类型的 Java 应用程序都能打包到单独的一个 JAR 文件中去. 必须符合一定的条件, 一个 Java 应用程序的所有文件才能打包到一个文件中去. 另外, JAR 文件有两种, 一种是有清单(manifest)文件的, 一种是没有清单文件的(这种主要用来存放 Java 库文件). 清单文件有许多作用, 我这里只讨论那种可以使用 Java 来运行 JAR 文件的清单文件. 就是使用命令
    java -jar MyJarFile.jar
    可以直接运行的 JAR 文件. 这种 JAR 文件的清单文件的内容如下所示:

Manifest-Version: 1.0
Main-Class: MainClassFile
Created-By: Your Company

. 例如, 假定你的程序里面的主程序是 com.abc.MainFrame, 那么你的这个清单文件的内容是:

Manifest-Version: 1.0
Main-Class: com.abc.MainFrame
Created-By: Abc Company

. 然后我想讨论一下打包到单独 JAR 文件的应用程序的编写需要注意的问题.
    程序的资源文件(如*.gif, *.jpg, *.jpeg, *.properties 等等)不能使用物理路径, 只能使用相对于当前类文件的相对资源路径, 只有这样才能保证打包以后程序才能找到这些资源文件. 那么, 这些文件在打开的时候都要使用下列语句:
    URL url = getClass().getResource(String name);
    或者
    InputStream in = getClass().getResourceAsStream(String name);
. 例如:
javax.swing.ImageIcon icon = new javax.swing.ImageIcon("1.gif");
那么打包后的程序将不能找到这个图片, 因为它引用了一个物理路径的图片, 它应该改成这样:
javax.swing.ImageIcon icon = new javax.swing.ImageIcon(getClass().getResource("1.gif"));
. 其它的资源文件的使用也与此相似. 不过属性文件(*.properties)的使用, Java 自动会加载 JAR 文件中的属性文件, 例如:
ResourceBundle.getBundle("com.abc.test");
那么, 这个文件只要放在 JAR 文件目录结构下的 com/abc/test.properties, Java 就能自动找到这个文件.
    接着我想讨论一下使用 JAR 工具如何来创建 JAR 文件, 这个工具可以在 <JDK_install_HOME>/bin 下找到, 文件名在 Win32 版下为 jar.exe, Unix 下为 jar. 在命令行窗口下输入 jar 命令, 将看到下列输出:
    用法:jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
选项:
    -c  创建新的归档
    -t  列出归档内容的列表
    -x  展开归档中的命名的(或所有的〕文件
    -u  更新已存在的归档
    -v  生成详细输出到标准输出上
    -f  指定归档文件名
    -m  包含来自指定的清单(manifest〕文件的清单(manifest〕信息
    -0  只存储方式;未用ZIP压缩格式
    -M  不产生所有项的清单(manifest〕文件
    -i  为指定的jar文件产生索引信息
    -C  改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和归档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺

示例1:将两个class文件归档到一个名为 'classes.jar' 的归档文件中:
       jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest〕文件 'mymanifest' 将 foo/ 目录下的所有
           文件归档到一个名为 'classes.jar' 的归档文件中:
       jar cvfm classes.jar mymanifest -C foo/ .

    假设你想将上面的 com.abc.MainFrame 为主程序的一个应用程序打包为一个单独的 JAR 文件, 那么首先在程序的根目录下建立内容如前所述的清单文件, 文件名为 MANIFEST.MF, 然后在命令行窗口下, 转变当前目录为程序根目录, 输入下列命令:
jar cvfm abcApp.jar MANIFEST.MF *.*
, 那么, 会使用现有的清单文件创建一个名为 abcApp.jar 的文件, 并将目录下的所有文件(包括子目录)加入此 JAR 文件中.
    而如果希望使用非 JAR 工具建立 JAR 文件, 建议使用 WinRAR. 首先还是需要建立一个清单文件(名字必须为MANIFEST.MF), 向此文件中写入同使用 JAR 工具时一样的内容, 接着需要建立一个META-INF子目录, 然后将 MANIFEST.MF 放入此目录, 接着就可以保持目录结构将所有这些内容使用 WinRAR 压缩为 ZIP 格式的文件, 文件名取为 abcApp.jar 即可. 如下所示, 目录结构为:
+
|
+-----/META-INF/MANIFEST.MF
|
+----com/abc/MainFrame.class
. 选中程序根目录下的各个子目录及根目录下的文件, 点击鼠标右键, 选择"添加到压缩包..."命令, 然后指定文件名为 abcApp.jar, 格式为 ZIP, 最后点击"确定"即可完成.
分享到:
评论

相关推荐

    java二维码制作jar包--Qrcode

    java二维码制作jar包

    用Eclipse制作jar包

    在IT行业中,创建Java应用程序...通过以上步骤,你就可以在Eclipse中成功创建.jar包了。这是一项基础但重要的技能,对于分发Java应用程序或组件非常有用。熟练掌握这一技巧,能够帮助你更好地管理和分享你的Java代码。

    eclipse 的jar插件,可以快速制作jar包

    在Eclipse中,制作JAR(Java Archive)文件是一项常见的任务,这通常是为了打包和分发Java项目,或者为了创建可执行的Java程序。Eclipse的jar插件就是为了解决这个问题而设计的,它简化了这个过程,使得开发者能够...

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

    通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行 编译。但是 JET 是要用钱买的,而且据说 JET 也不是能把所有的 Java 程序都编译成执行文件...

    打Jar包小工具,运行cmd.bat自动打jar包

    "打Jar包小工具"是一个便捷的解决方案,旨在简化这个过程。这个工具包含两个核心文件:`cmd.bat` 和 `package.txt`。 `cmd.bat` 是一个批处理脚本,它通常包含了运行Java的jar打包命令,如`jar`命令。在Windows环境...

    图形报表制作jar包:cewolf

    Cewolf,能用于开发web工程的Servlet或JSP等,用于制作比较复杂的统计图表.它能够在写比较少的java代码的情况下,显示JSP页面,通过设置图的特征,象颜色,线条,图形,大小,比例等等.

    Java在制作jar包时引用第三方jar包的方法

    在Java开发中,常常需要将应用程序打包成JAR文件以便分发和部署。如果应用程序依赖于第...以上就是Java在制作jar包时引用第三方jar包的方法的详细知识点,希望能帮助开发者在打包Java应用时遇到相关问题能够得到解决。

    jar打包工具 jar

    本人经历三天制作出炉的jar打包工具,请大家下载试用。

    帆软报表使用jar包

    在IT行业中,尤其是在Java开发领域,使用库和框架的jar包是常见的实践。"帆软报表"是一款国内广泛应用的报表工具,它提供了丰富的报表设计、数据处理和展示功能,广泛应用于企业的数据分析和业务报表制作。本篇文章...

    ant打jar包以及制作成bat文件双击运行

    制作jar包的过程主要涉及到Ant的`&lt;jar&gt;`任务。在build.xml文件中,你需要定义一个`&lt;project&gt;`元素,然后在其中添加`&lt;target&gt;`元素来定义构建步骤。例如,你可以创建一个名为`create-jar`的目标,它包含一个`&lt;jar&gt;`...

    jar包制作成为安装程序

    为了方便非开发人员或者不熟悉命令行的用户,我们需要将jar包制作成可执行的exe文件。本文将详细介绍如何将jar包转换为exe安装程序。 首先,我们需要了解jar转exe的原理。这个过程主要是通过创建一个启动器,该启动...

    mycat2(mycat2-1.22-release-jar-with-dependencies.jar)

    mycat2(mycat2-1.22-release-jar-with-dependencies.jar)

    java制作excle报表的jar包

    java制作excle报表的jar包 java制作excle报表的jar包

    java带包编译和jar包的生成

    java带包编译和jar包的生成

    Docker的安装+JDK镜像的拉取+jar包的运行

    SpringBoot+SSM生成的jar包发布到docker,如果不是SpringBoot,则需要配置tomcat

    《Linux中自制启动/停止脚本文件》用到的jar——mytask.jar

    用于演示《Linux中自制启动/停止脚本文件》一文中的例子,特提供次jar

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

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

    javajar包运行及bat文件制作.doc

    本文将详细介绍如何在DOS环境下运行Java jar包以及如何创建用于自动执行的bat文件。 #### 二、基础知识介绍 1. **Java Jar 包**:jar文件是Java的一种标准打包格式,它可以包含编译后的.class文件、资源文件以及一...

    个人jar包自己封装的

    【标题】"个人jar包自己封装的" 涉及的知识点主要是在Java开发中如何创建和打包自己的Java应用程序。一个jar(Java Archive)文件是Java平台的标准打包机制,它将多个类文件、资源文件和其他元数据组合到一个单一的...

Global site tag (gtag.js) - Google Analytics