麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設計 > 正文

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

2019-11-18 14:25:22
字體:
供稿:網(wǎng)友

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


摘要

本文展示如何將不可運行的JAR變?yōu)榭蛇\行的,并且不用直接操作manifest文件。你將學會開發(fā)一個短小的程序使得任何JAR文件都可以使用java -jar命令或者通過在像Windows上雙擊而運行。

你可以將一個應用的所有類和資源打包到一個JAR文件中。實際上,那就是jar文件的一個目的。另外一個目的是讓用戶可以非常輕易的執(zhí)行存儲在JAR文件中的應用,那么為什么當他們可以成為一等公民而和本機可執(zhí)行程序等同的時候,我們?yōu)槭裁匆屗麄冎怀袚墓δ芏蔀閖ava世界中的二等公民呢?

要執(zhí)行一個jar文件,你可以使用java命令的-jar選項。例如你有一個可運行的文件名為myjar.jar的JAR文件,因為它是可運行的,你可以像這樣執(zhí)行它:java -jar myjar.jar

另外,當JRE安裝在像Windows這樣的操作系統(tǒng)上時,將jar文件和JVM關(guān)聯(lián)后你就可以雙擊他們運行應用了。這些JAR必須是可運行的。

問題是:你如何讓一個JAR是可運行的?


manifest文件和Main-Class條目

在大部分JAR文件中,META-INF目錄下會有一個MANIFEST.MF文件,在那個文件中有一個非凡的條目Main-Class,它告訴java -jar命令去執(zhí)行那么類。

問題是你必須自己恰當?shù)膶⑦@個非凡條目加到manifest文件中:它必須位于特定的位置并且必須符合特定的格式,然而有些人不喜歡編輯配置文件。


讓API幫你做

從Java 1.2開始引人的java.util.jar包可以讓你操作jar文件(注重:它建立在java.util.zip包的基礎上)。更確切的說法是,java.util.jar可以讓你通過Manifest類非常輕易的操作那個非凡的manifest文件。
讓我們編寫一個程序使用那個API。首先這個程序必須知道三件事情:

1. 我們希望可以執(zhí)行的JAR
2. 我們希望執(zhí)行的主類(這個類必須存在于JAR內(nèi))
3. 新的JAR文件的文件名,因為我們不應該簡單的覆蓋那些文件


編寫程序

上面的列表將會構(gòu)成我們的程序的參數(shù),基于這一點,讓我們?yōu)檫@個應用挑選一個合適的名字。MakeJarRunnable聽起來如何?


檢查main的參數(shù)

假設我們的main入口是一個標準的main(String[])方法,我們首先應該檢查程序的參數(shù):

if (args.length != 3) { System.out. "); System.exit(0); }

請注重參數(shù)列表是如何被解釋的,因為這對于后面的代碼是非常重要的。參數(shù)的順序和內(nèi)容并不是硬性設置的,但是假如你改變它們也要記得適當?shù)男薷钠渌拇a。


訪問JAR和它的manifest文件

首先我們必須創(chuàng)建一些知道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(); }


設置Main-Class屬性

我們將Main-Class條目放到manifest文件的主要屬性部分。一旦我們從manifest對象獲得了這個屬性集我們就可以設置適當?shù)闹黝悺H欢偃缫粋€Main-Class屬性已經(jīng)存在于原來的JAR時怎么辦?這個程序簡單的打印一個警告并退出。或許我們可以增加一個命令行參數(shù)告訴程序用新的值替換已經(jīng)存在的那個值.

Attributes a = manifest.getMainAttributes(); String oldMainClass = a.putValue("Main-Class", args[1]); //If an old value exists, tell the user and exit if (oldMainClass != null) { System.out.println("Warning: old Main-Class value is: " + oldMainClass); System.exit(1); }


輸出新的JAR

我們需要創(chuàng)建一個新的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 input byte[] buf = new byte[4096]; //Iterate the entries JarEntry entry; while ((entry = jarIn.getNextJarEntry()) != null) { //Exclude the manifest file from the old JAR if ("META-INF/MANIFEST.MF".equals(entry.getName())) continue; //Write the entry to the output JAR jarOut.putNextEntry(entry); int read; while ((read = jarIn.read(buf)) != -1) { jarOut.write(buf, 0, read); } jarOut.closeEntry(); } //Flush and close all the streams jarOut.flush(); jarOut.close(); jarIn.close();


完整程序

當然我們必須將這些代碼放到一個類里面的main方法里面,并且具有合適的import聲明。


使用范例

讓我們用一個范例來使用這個程序。假設你有一個應用其main入口點是類HelloRunnableWorld(這個是它的全類名,也就是包含包名),同樣假設你已經(jīng)創(chuàng)建了一個名字為myjar.jar的JAR,包含整個應用。對于這個jar,我們像這樣運行MakeJarRunnable:

java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar

再強調(diào)一次,就像早先提到的,注重參數(shù)列表的順序。假如忘記了順序,以無參的形式運行程序它就會告訴你使用信息。

使用java -jar命令運行myjar.jar和myjar_r.jar,注重它們的差異。完成這些之后,查看一下它們的manifest文件(META-INF/MANIFEST.MF)。

這里有一個建議:將MakeJarRunnable制作成一個可以運行的JAR!


運行它

通過雙擊一個JAR或者使用簡單的命令總是比將它包含在你的classpath并運行特定的main類方便。為了幫助你作到這一點,JAR規(guī)范為JAR的manifest文件提供了一個Main-Class屬性。我在這里提出的這個程序讓你利用Java的JAR API非常輕易的操作這個屬性并制作你自己的可運行的JAR。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲国产成人久久一区www妖精 | av电影院在线观看 | h色视频在线观看 | 蜜桃网站在线 | 黄色网址在线播放 | 亚洲人成在线播放网站 | 在线成人影视 | 成人综合一区二区 | 日日噜噜噜夜夜狠狠久久蜜桃 | 国产一级aa大片毛片 | 亚洲一区二区不卡视频 | 欧美女同hd | 色妞欧美| 久草在线网址 | 九九热在线免费观看视频 | 久久影院在线观看 | 成人在线观看一区二区 | 精品国产91一区二区三区 | 久久精品九九 | 九九热国产视频 | 国产精品毛片va一区二区三区 | 国产1区2区在线 | 国产日产精品一区二区三区四区 | 欧美一级黄色网 | av电影院在线观看 | 久久精品4 | 欧美成人三级视频 | 欧美大逼网 | 羞羞视频免费网站含羞草 | 我爱我色成人网 | 海角在线观看91一区二区 | 中文字幕在线观看网址 | 九草网| 人禽l交免费视频观看 视频 | 色啪综合 | 欧美成人做爰高潮片免费视频 | h视频在线播放 | 88xx成人永久免费观看 | 免费观看三级毛片 | 在线观看免费av网 | 激情久久免费视频 |