快速业务通道

使不能运行的JAR文件可以使用java -jar运行 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21

使不能运行的JAR文件可以使用java -jar运行

时间:2011-01-02 ljdrer

摘要

本文展示如何将不可运行的JAR变为可运行的,并且不用直接操作manifest文件。你将学会开发一个短小的程序使得任何JAR文件都可以使用java -jar命令或者通过在像Windows上双击而运行。

你可以将一个应用的所有类和资源打包到一个JAR文件中。实际上,那就是jar文件的一个目的。另外一个目的是让用户可以非常容易的执行存储在JAR文件中的应用,那么为什么当他们可以成为一等公民而和本机可执行程序等同的时候,我们为什么要让他们只承担包的功能而成为java世界中的二等公民呢?

要执行一个jar文件,你可以使用java命令的-jar选项。例如你有一个可运行的文件名为myjar.jar的JAR文件,因为它是可运行的,你可以像这样执行它:java -jar myjar.jar

另外,当JRE安装在像Windows这样的操作系统上时,将jar文件和JVM关联后你就可以双击他们运行应用了。这些JAR必须是可运行的。

问题是:你如何让一个JAR是可运行的?

manifest文件和Main-Class条目

在大部分JAR文件中,META-INF目录下会有一个MANIFEST.MF文件,在那个文件中有一个特殊的条目Main-Class,它告诉java -jar命令去执行那么类。

问题是你必须自己恰当的将这个特殊条目加到manifest文件中:它必须位于特定的位置并且必须符合特定的格式,然而有些人不喜欢编辑配置文件。

让API帮你做

从Java 1.2开始引人的java.util.jar包可以让你操作jar文件(注意:它建立在java.util.zip包的基础上)。更确切的说法是,java.util.jar可以让你通过Manifest类非常容易的操作那个特殊的manifest文件。

让我们编写一个程序使用那个API。首先这个程序必须知道三件事情:

1. 我们希望可以执行的JAR

2. 我们希望执行的主类(这个类必须存在于JAR内)

3. 新的JAR文件的文件名,因为我们不应该简单的覆盖那些文件

编写程序

上面的列表将会构成我们的程序的参数,基于这一点,让我们为这个应用挑选一个合适的名字。MakeJarRunnable听起来如何?

检查main的参数

假设我们的main入口是一个标准的main(String[])方法,我们首先应该检查程序的参数:

if (args.length != 3) {      System.out.println("Usage: MakeJarRunnable "               + "<jar file> <Main-Class> <output>");      System.exit(0);    }

请注意参数列表是如何被解释的,因为这对于后面的代码是非常重要的。参数的顺序和内容并不是硬性设置的,但是如果你改变它们也要记得适当的修改其他的代码。

访问JAR和它的manifest文件

首先我们必须创建一些知道JAR和manifest文件的对象:

//Create the JarInputStream object, and get its manifest    JarInputStream jarIn = new JarInputStream(new FileInputStream(args[0]));    Manifest manifest = jarIn.getManifest();    if (manifest == null) {      //This will happen if no manifest exists    manifest = new Manifest();    }

使不能运行的JAR文件可以使用java -jar运行(2)

时间:2011-01-02 ljdrer

设置Main-Class属性

我们将Main-Class条目放到manifest文件的主要属性部分。一旦我们从manifest对象获得了这个属性集我们就可以设置适当的主类。然而如果一个Main-Class属性已经存在于原来的JAR时怎么办?这个程序简单的打印一个警告并退出。或许我们可以增加一个命令行参数告诉程序用新的值替换已经存在的那个值.

Attributes a = manifest.getMainAttributes();    String oldMainClass = a.putValue("Main-Class", args[1]);    //If an old value exists, tell the user and e

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号