?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

打长沙麻将的技巧:巨人娱乐登录门户:使不能运行的JAR文件可以使用java jar运行

?

长沙转转麻将必胜口诀 www.fv7j.com.cn 不能运行的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包的根基上)。更确切的说法是,jav巨人娱乐登录门户a.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 "+ "");System.exit(0);}

请留意参数列表是若何被解释的,由于这对付后面的代码是异常紧张的。参数的顺序和内容并不是硬性设置的,然则假如你改变它们也要记得适当的改动其他的代码。

造访JAR和它的manifest文件

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

//Create the JarInputStream object, and get its manifestJarInputStream jarIn = new JarInputStream(new FileInputStream(args[0巨人娱乐登录门户]));Manifest manifest = jarIn.getManifest();if (manifest == null) {//This will happen if no manifest existsmanifest = new Manifest();}

设置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 exitif (oldMainClass != null) {System.out.println("Warning: old Main-Class value is: "+ oldMainClass);System.exit(1);}

输出新的JAR

我们必要创建一个新的jar文件,由于我们必须应用JarOutputStream类。留意我们必须包管没有将输入作为输出应用。作为替代,大概法度榜样应该斟酌两个jar文件相同并且提示用户是否覆盖原本的。然而我将这个保留给读者作为演习。

System.out.println("Writing to " + args[2] + "...");JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(args[2]),manifest);

我们必须将原本的JAR中的每个条款都写到新的JAR中,由于对那些条款迭代:

//Create a read buffer to transfer data from the inputbyte[] buf = new byte[4096];//Iterate the entriesJarEntry entry;while ((entry = jarIn.getNextJarEntry()) != null) {//Exclude the manifest file from the old JARif ("META-INF/MANIFEST.MF".equals(entry.getName())) continue;//Write the entry to the output JARjarOut.putNextEntry(entry);int read;while ((read = jarIn.read(buf)) != -1) {jarOut.write(buf, 0, read);}jarOut.closeEntry();}//Flush 巨人娱乐登录门户and close all the streamsjarOut.flush();jarOut.close();jarIn.close();

完备法度榜样

当然我们必须将这些代码放到一个类里面的main措施里面,并且具有相宜的import声明。

应用典型

让我们用一个典型来应用这个法度榜样。假设你有一个利用其main进口点是类HelloRunnableWorld(这个是它的全类名,也便是包孕包名),同样假设你已经创建了一个名字为myjar.jar的JAR,包孕全部利用。对付这个jar,我们像这样运行MakeJarRunnable:

java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar

再强调一次,就像起初提到的,留意参数列表的顺序。假如忘怀了顺序,以无参的形式运行法度榜样它就会奉告你应用信息。

应用java -jar敕令运行myjar.jar和myja巨人娱乐登录门户r_r.jar,留意它们的差异。完成这些之后,查看巨人娱乐登录门户一下它们的manifest文件(META-INF/MANIFEST.MF)。

这里有一个建议:将MakeJarRunnable制作成一个可以运行的JAR!

运行它

经由过程双击一个JAR或者应用简单的敕令老是比将它包孕在你的classpath并运行特定的main类方便。为了赞助你作到这一点,JAR规范为JAR的manifest文件供给了一个Main-Class属性。我在这里提出的这个法度榜样让你使用Java的JAR API异常轻易的操作这个属性并制作你自己的可运行的JAR。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: