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. hit2739

    好题,回路的问题一般都要转化为度数来做若原图的基图不连通,或者存在某个点的入度或出度为0则无解.统计所有点的入度出度之差di对于di>0的点,加边(s,i,di,0):对于di<0的点,加 ...

  2. 安卓长按交互onCreateContextMenu的简单 用法

    1.可在activity和fragment中使用. 2.使用方法 (1)注册 registerForContextMenu(btn);//btn是要实现交互的控件 (2)重写onCreateConte ...

  3. 字典树(Trie Tree)

    终于要开始更新我的ACM学习之路了,不过没想到却是因为一次Java大作业,有趣,%yuan老师. 字典树是一种很简单的树形结构,主要用来进行词频统计,在算法竞赛中有时也会碰到. 字典树的基本思路是,通 ...

  4. cogs p服务点设置

    5. P服务点设置 ★★   输入文件:djsc.in   输出文件:djsc.out   简单对比时间限制:2 s   内存限制:128 MB 问题描述为了进一步普及九年义务教育,政府要在某乡镇建立 ...

  5. POJ 3180 The Cow Prom(SCC)

    [题目链接] http://poj.org/problem?id=3180 [题目大意] N头牛,M条有向绳子,能组成几个歌舞团?要求顺时针逆时针都能带动舞团内所有牛. [题解] 等价于求点数大于1的 ...

  6. 通过python的logging模块输出日志文件

    import logging import sys #获取logger实例 logger = logging.getLogger("baseSpider") # 括号后面填运行的文 ...

  7. 1.4(java学习笔记) 面向对象内存分析

      首先介绍几个概念 栈: 1.栈是方法执行的内存模型,每调用一个方法都会创建一个栈帧. 2.jvm为每个线程创建一个栈,存放方法相关信息,栈属于线程私有不共享. 3.栈由系统自动分配,是连续的内存空 ...

  8. 使用Maven下载jar包

    有些开源项目不直接提供jar包的下载,而是建议使用Maven下载,以开源库hipster(https://github.com/citiususc/hipster,http://www.hipster ...

  9. 关于Block Formatting Context--BFC和IE的hasLayout(转)

    转文请标明 --- 出处:穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为“块级格式化范围”. ...

  10. Eclipse快速补全快捷键Ctrl+1修改为Android Studio的Alt+Enter

    步骤: Window ->Preferences->key-> type filter text 下输入quick fix(这个是快速补全的快捷键)改为Alt+Enter 下面的wh ...