国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

制作可執行JAR

2019-11-18 15:25:18
字體:
來源:轉載
供稿:網友

  本文闡述了如何把一個不可執行的java Archive(JAR)文件變成可執行,而不用直接操作manifest文件。你會學到寫出短小的一個程序,通過運行java -jar命令或在像windows一樣的操作系統里面用雙擊鼠標運行任何JAR文件。

你可以很輕易地把應用程序的一整套class文件和資源文件打包到一個JAR中。事實上這就是jar文件存在的一個目的。另外一個目的就是讓用戶能很輕易地執行被打包到jar文件里面的應用程序。那么為什么jar文件僅僅作為文件在整個java里面占據了次要的地位,而本地執行則被忽視?

要執行一個jar文件,你可以使用java命令的-jar選項。舉一個例子來說,假如你有個名叫myjar.jar的文件。這個jar是可以運行的,你可以運行它:java -jar myjar.jar.另外一個辦法就是,當Java Runtime Environment(JRE)已經被安裝到一個像windows的操作系統上,將jar文件與JVM關聯(關聯java.exe跟jar文件)在一起你就可以通過雙擊jar來運行這個應用程序。當然,jar文件必須是可執行的。

現在的問題是:如何做一個可以執行的jar?

manifest文件以及Main-class入口

在大多數jar中,都在一個叫META-INF的目錄里面保存了一個叫MANIFEST.MF的文件。那個文件里面,

包含了一個非凡表項名字叫Main-Class,告訴java -jar命令應該執行哪個class.
問題是你必須為manifest文件手工加入適當表項,而且必須在一定的位置和用一定的格式。不幸的是,不是每個人都喜歡打開寫字板編輯配置文件。

讓API幫你完成任務

自從java1.2發布以來,一個叫java.uil.jar包的出現,讓你能夠方便處理jar文件。(注重:該包基于java.util.zip)非凡地,jar包讓你通過Mainfest類,可以輕易操作那些manifest文件.

就讓我們用這個API寫一個程序吧。首先,這個程序必須知道三樣東西:

1。我們要使之可運行的jar文件。
2。運行jar的主類(這個類必須包含在jar中)。

3。輸出新jar文件的文件名,因為我們不能簡單地覆蓋原來的文件。

編寫程序

上面列表的三點要求將組成我們的程序的參數。現在,讓我們為這個程序選擇一個適當的名字。

MakeJarRunnable聽起來覺得怎樣?

為main方法檢查參數

假設我們的main方法入口點是一個標準的main(String[])方法。我們應該這樣檢查程序的參數:

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

}

請注重參數列表是如何描述的,因為這在以下代碼中是很重要的。參數的次序和內容不是固定的;

然而,假如你要改變他們的話,要記住響應修改其他代碼。

訪問jar和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();

}

設置Main-Class屬性

我們把Main-Class入口放到manifest文件的main屬性部分。一旦從manifest對象獲得這個屬性,就可以設置需要的main class。然而,假如main-Class屬性已經存在原來的jar當中又如何呢?這里我們只是簡單地輸出一個警告然后退出。我們能加入一個命令行參數告訴程序使用新的值,而代替了舊的那個:

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

我們需要創建一個新的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代碼。完整程序:

http://www.javaworld.com/javaworld/javatips/javatip127/MakeJarRunnable.zip

程序使用例子

讓我們把這個程序應用到一個例子里面來。假設你有一個應用程序,該程序的入口點是一個叫HelloRunnableWorld的 類,再假設你已經創建了一個jar叫myjar.jar,包含了整個程序。運行MakeJarRunnable:

java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar

正如前面提到的,注重一下我的參數順序。假如你忘記了順序,沒有參數運行一下程序,它會響應出現一個 用法提示信息。

嘗試對myjar.jar運行java -jar命令。然后對myjar_r.jar。注重區別不同!好了,你完成了這一切了, 瀏覽一下每個jar的manifest文件(META-INF/MANIFEST.MF)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福海县| 陇川县| 万安县| 柞水县| 福州市| 望江县| 静乐县| 小金县| 阿拉善左旗| 雅江县| 资阳市| 曲水县| 汶川县| 嘉兴市| 托克托县| 古丈县| 商水县| 柳河县| 天峻县| 崇义县| 内丘县| 柘城县| 通渭县| 绥化市| 孝感市| 德格县| 都昌县| 汶川县| 卫辉市| 长乐市| 博客| 新邵县| 开鲁县| 静海县| 仪陇县| 海盐县| 安溪县| 南昌市| 司法| 绥棱县| 龙胜|