Java编写的application程序是否能够最终形成一个类似于exe一样的可执行文件,难道就只能用命令行运行?
---------------------------------------------------------------

通常有两种,一种是制作一个可执行的JAR文件包,然后就可以像.chm文档一样双击运行了;而另一种是使用JET来进行编译。但是JET是要用钱买的,而且据说JET也不是能把所有的Java程序都编译成执行文件,性能也要打些折扣。所以,使用制作可执行JAR 文件包的方法就是最佳选择了,何况它还能保持Java的跨平台特性。

下面就来看看什么是JAR文件包吧:

1. JAR文件包

JAR文件就是Java Archive File,顾名思意,它的应用是与Java息息相关的,是Java的一种文档格式。JAR文件非常类似ZIP文件——准确的说,它就是ZIP文件,所以叫它文件包。JAR文件与ZIP文件唯一的区别就是在JAR文件的内容中,包含了一个META-INF/MANIFEST.MF文件,这个文件是在生成JAR文件的时候自动创建的。举个例子,如果我们具有如下目录结构的一些文件: 
  == 
-- test 
-- Test.class 
把它压缩成ZIP文件test.zip,则这个ZIP文件的内部目录结构为: 
  test.zip 
  `-- test 
    `-- Test.class

如果我们使用JDK的jar命令把它打成JAR文件包test.jar,则这个JAR文件的内部目录结构为: 
 test.jar 
  |-- META-INF 
  |  `-- MANIFEST.MF 
  `-- test 
    `--Test.class 
2. 创建可执行的JAR文件包

制作一个可执行的JAR文件包来发布你的程序是JAR文件包最典型的用法。

Java程序是由若干个.class文件组成的。这些.class文件必须根据它们所属的包不同而分级分目录存放;运行前需要把所有用到的包的根目录指定给CLASSPATH环境变量或者java命令的-cp参数;运行时还要到控制台下去使用java命令来运行,如果需要直接双击运行必须写Windows的批处理文件(.bat)或者Linux的Shell程序。因此,许多人说,Java是一种方便开发者苦了用户的程序设计语言。

其实不然,如果开发者能够制作一个可执行的JAR文件包交给用户,那么用户使用起来就方便了。在Windows下安装JRE(Java Runtime Environment)的时候,安装文件会将.jar文件映射给javaw.exe打开。那么,对于一个可执行的JAR文件包,用户只需要双击它就可以运行程序了,和阅读.chm文档一样方便(.chm 文档默认是由hh.exe打开的)。那么,现在的关键,就是如何来创建这个可执行的JAR文件包。

创建可执行的JAR文件包,需要使用带cvfm参数的jar命令,同样以上述test目录为例,命令如下:

jar cvfm test.jar manifest.mf test

这里test.jar和manifest.mf两个文件,分别是对应的参数f和m,其重头戏在manifest.mf。因为要创建可执行的JAR文件包,光靠指定一个manifest.mf文件是不够的,因为MANIFEST是JAR文件包的特征,可执行的JAR文件包和不可执行的JAR文件包都包含MANIFEST。关键在于可执行JAR文件包的MANIFEST,其内容包含了 Main-Class一项。这在MANIFEST中书写格式如下:

Main-Class: 可执行主类全名(包含包名)

例如,假设上例中的Test.class是属于test包的,而且是可执行的类(定义了 public static void main(String[]) 方法),那么这个manifest.mf可以编辑如下:

Main-Class: test.Test <回车>

这个manifest.mf可以放在任何位置,也可以是其它的文件名,只需要有Main-Class: test.Test 一行,且该行以一个回车符结束即可。创建了manifest.mf文件之后,我们的目录结构变为: 
  == 
   |-- test 
   |  `-- Test.class 
  `-- manifest.mf

这时候,需要到test目录的上级目录中去使用jar命令来创建JAR文件包。也就是在目录树中使用“==”表示的那个目录中,使用如下命令:

jar cvfm test.jar manifest.mf test

之后在“==”目录中创建了test.jar,这个test.jar就是执行的JAR文件包。运行时只需要使用java -jar test.jar 命令即可。

需要注意的是,创建的JAR文件包中需要包含完整的、与Java程序的包结构对应的目录结构,就像上例一样。而 Main-Class 指定的类,也必须是完整的、包含包路径的类名,如上例的test.Test;而且在没有打成JAR文件包之前可以使用java <类名> 来运行这个类,即在上例中 java test.Test 是可以正确运行的 (当然要在 CLASSPATH 正确的情况下)。

java之生成jar包的更多相关文章

  1. Linux下编译java并生成jar包

    下面是WordCount.java类 package com.ll; import java.io.IOException; import java.util.Iterator; import jav ...

  2. java class生成jar包(转)

    进入dos操作符窗口cd进入要打成jar包的class文件所有文件夹目录jar cvf [生成jar的名称.jar] [列出class文件] //若有多个,以空隔隔开 如:一.操作零散的单个或几个cl ...

  3. JAVA记录-生成jar包方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, Manifest-Version: 1.0 Class-Path: lib/commons-cod ...

  4. java自动生成jar包工具

    jar -cfe Main.jar com.xjq.test.Main com/xjq/test/Main.class jar -cmef manifest.mf com.xjq.test.Main ...

  5. idea如何生成jar包

    最近在研究RMI反序列化命令执行的漏洞,让我这个java新手吃尽了苦头,能多学习一些是一些吧. 记录一下写好的java文件生成jar包的过程. 环境: Win10,jdk1.7, idea2016.2 ...

  6. eclipse生成【带有外部jar包】的java可执行jar包

    之前有写过一篇使用eclipse生成java可执行jar包,但是最近的一次使用中无论如何都不成功,当双击执行打成的jar时,弹出如下错误: could not find the main class: ...

  7. java 生成jar包并保留注释

      java 生成jar包并保留注释 CreationTime--2018年7月17日08点32分 Author:Marydon 1.选中java项目-->右键-->Export: 2.去 ...

  8. 【JAVA】使用Eclipse依赖生成jar包时,避免最外层同时生成资源文件的配置。

    使用Eclipse依赖生成jar包时,如果做配置,生成的jar包文件会全部生成在外面,这并不是我们需要的,下面我们一起来修改下配置,使生成的jar包符合我们的需求吧. 1.如果不做任何配置生成的jar ...

  9. Android studio module生成jar包,module中引用的第三方库没有被引用,导致java.lang.NoClassDefFoundError错误。

    android studio 创建了一个Module生成jar包,这个module中有引用一些第三方的类库,比如 gson,volley等. 但是生成的jar包里,并没有将gson,volley等第三 ...

随机推荐

  1. foreach 与 Linq的 Select 效率问题

    Resharper 是一个非常强大的C#编程辅助工具,有着非常强的提示功能,代码纠正,代码简化等等 在编码过程中注意到这么一件事,可能是大家经常会遇到的: 遍历某个集合,然后经过处理生成另外一个集合, ...

  2. (五)cobbler自定义系统安装

    注意:需要提前获取到物理机对应的网卡的MAC地址,例如我这里使用虚拟机进行演示 cobbler system add --name=linux-node2.com --mac=00:50:56:22: ...

  3. php+mysql折线图

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  4. 洛谷 P1012 拼数 [字符串]

    题目描述 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4 ...

  5. Tarjan求LCA总结

    Tarjan算法向上标记法:从x向上走到根节点,并标记所有经过的点从y向上走到根节点,当第一次遇到已标记的节点时,就找到了LCA(x, y)对于每个询问,向上标记法的时间复杂度最坏为O(n) 在深度遍 ...

  6. 加快Vue项目的开发速度

    巧用Webpack Webpack是实现我们前端项目工程化的基础,但其实她的用处远不仅仅如此,我们可以通过Webpack来帮我们做一些自动化的事情.首先我们要了解require.context()这个 ...

  7. POJ 2315:Football Game(博弈论)

    [题目链接] http://poj.org/problem?id=2315 [题目大意] 两名球员轮流从N个球中挑出不多于M个射门,每个球半径都是R,离球门S. 每次只能踢出L以内的距离.进最后一个球 ...

  8. Mysql中的JSON系列操作函数

    前言 JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编写.对机器来说易于解析和生成,并且会减少网络带宽的传输. JSON的格式非常简单:名称/ ...

  9. [CF911A]Nearest Minimums

    题目大意: 给你一个数列,问数列中最小数的最近距离. 思路: 直接模拟即可. #include<cstdio> #include<cctype> #include<alg ...

  10. java-List集合遍历,删除或增加特定的元素

    1.for(int i=0; i<list.size(); i++) 2.for(Object object : list)  实质调用的 list.iterator() 3.list.iter ...