不能运行的JAR文件可以使用java -jar运行
摘要
本文展示如何将不可运行的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 " + "