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

巨人娛樂登錄門戶:使不能運行的JAR文件可以使用java jar運行

?

不能運行的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。

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

浙江体彩20选5开奖号 网络射击游戏 股票推荐群是真的是假的 波克城市棋牌下载 股票600028 黑龙江快乐十分钟开 四场进球彩中奖牛人 熊猫四川麻将* 盈牛配资 口碑最好的股票配资平台 高中生炒股赚4.5亿 百度金融理财平台 众信配资 慧投金融 下载熊猫麻将 安徽彩十一选五走势 足球竞彩网app