亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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

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

  不能運行的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. "); System.exit(0); }

請注重參數列表是如何被解釋的,因為這對于后面的代碼是非常重要的。參數的順序和內容并不是硬性設置的,但是假如你改變它們也要記得適當的修改其他的代碼。


訪問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文件的主要屬性部分。一旦我們從manifest對象獲得了這個屬性集我們就可以設置適當的主類。然而假如一個Main-Class屬性已經存在于原來的JAR時怎么辦?這個程序簡單的打印一個警告并退出?;蛟S我們可以增加一個命令行參數告訴程序用新的值替換已經存在的那個值.

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聲明。


使用范例

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

java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar

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

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

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


運行它

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品人人做人人爽| 欧美性生活大片免费观看网址| 91国语精品自产拍在线观看性色| 26uuu国产精品视频| 色综合91久久精品中文字幕| 亚洲一区二区三区在线免费观看| 日韩欧美亚洲国产一区| 国产精品第8页| 国产91热爆ts人妖在线| 亚洲国产成人久久综合一区| 久久精品一本久久99精品| 日韩a**站在线观看| 九色精品美女在线| 久久综合久久八八| 国产亚洲福利一区| 中文字幕av一区二区| 日韩精品中文字幕视频在线| 久久精品91久久香蕉加勒比| 国产成人在线一区| 国外成人在线视频| 91久久精品美女| 精品欧美aⅴ在线网站| 国产裸体写真av一区二区| 宅男66日本亚洲欧美视频| 亚洲国产福利在线| 国产精品激情av电影在线观看| 久久久国产成人精品| 久久综合九色九九| 另类专区欧美制服同性| 欧美二区在线播放| 色综久久综合桃花网| 91av中文字幕| 亚洲人成在线一二| 日韩欧美国产视频| 欧美激情手机在线视频| 深夜福利亚洲导航| 中文字幕亚洲综合久久| 日本高清+成人网在线观看| 亚洲无线码在线一区观看| 欧美一区二三区| 亚洲精品中文字幕av| 亚洲高清在线观看| 欧美成人一区二区三区电影| 亚洲欧洲国产一区| 亚洲欧美另类中文字幕| 97热精品视频官网| 浅井舞香一区二区| 亚洲成人激情在线| 91九色单男在线观看| 成人免费高清完整版在线观看| 川上优av一区二区线观看| 国产成人综合精品| 亚洲精品久久久久久下一站| 红桃视频成人在线观看| 亚洲精品福利在线| 97超级碰碰人国产在线观看| 欧美性高潮床叫视频| 91经典在线视频| 韩国福利视频一区| 国产精品在线看| 欧美激情女人20p| 国产视频精品va久久久久久| 91影视免费在线观看| 色婷婷成人综合| 欧美野外wwwxxx| www.久久撸.com| 亚洲欧美中文另类| 国产精品久久久久久久9999| 在线看日韩av| 国产精品劲爆视频| 亚洲欧洲高清在线| 中文字幕欧美日韩va免费视频| 国产精品视频自在线| 日韩电影免费观看在线| 精品国产电影一区| 精品国产区一区二区三区在线观看| 欧美一区亚洲一区| 欧洲日韩成人av| 亚洲三级免费看| 国产一区二区三区三区在线观看| 日韩美女在线观看一区| 亚洲视频网站在线观看| 国产精品久久久久久av福利软件| 性色av香蕉一区二区| 亚洲激情在线观看| 中日韩美女免费视频网址在线观看| 欧美精品日韩三级| 国产不卡视频在线| 国产精品青草久久久久福利99| 国产精品无码专区在线观看| 97精品欧美一区二区三区| 欧美人在线视频| 久久99精品视频一区97| 伊人伊人伊人久久| 日韩天堂在线视频| 国产视频一区在线| 日韩精品视频免费专区在线播放| 亚洲精品视频在线播放| 国产精品久久久久久超碰| 按摩亚洲人久久| 91精品久久久久久| 久久久噜噜噜久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲福利影片在线| 欧美放荡办公室videos4k| 91日本在线观看| 有码中文亚洲精品| 一本色道久久综合亚洲精品小说| 欧美极品美女电影一区| 日韩精品视频免费在线观看| 日韩精品久久久久久福利| 视频在线观看99| 亚洲精品综合久久中文字幕| 国产热re99久久6国产精品| 久久激情视频免费观看| 国产女同一区二区| 精品一区二区三区四区| 亚洲精品欧美日韩专区| 成人免费观看网址| 亚洲丁香婷深爱综合| 欧美成aaa人片在线观看蜜臀| 在线亚洲午夜片av大片| 九九九久久久久久| 色诱女教师一区二区三区| 最近2019中文字幕大全第二页| 国产xxx69麻豆国语对白| 91精品视频一区| 国产福利精品在线| 久久全国免费视频| 成人午夜在线影院| 欧美精品999| 精品久久久久久| 国产日韩欧美电影在线观看| 久久亚洲精品一区二区| 亚洲护士老师的毛茸茸最新章节| 亚洲男子天堂网| 国产91精品青草社区| 成人国产精品一区| 一区二区三欧美| 亚洲国产精品va在线观看黑人| 九九热精品在线| 日韩欧亚中文在线| 亚洲最大av网站| 精品二区三区线观看| 国内揄拍国内精品| 亚洲视频在线播放| 国产日韩欧美一二三区| 在线色欧美三级视频| 欧美一级免费看| 深夜精品寂寞黄网站在线观看| 狠狠躁18三区二区一区| 亚洲精品一二区| 日韩欧美在线第一页| 日本免费久久高清视频| 成人97在线观看视频| 欧美黑人巨大xxx极品| 国产精品成人av在线| 日本精品久久久| 精品福利一区二区| 国内精久久久久久久久久人| 色偷偷亚洲男人天堂| 久操成人在线视频| 亚洲成人久久电影| 欧美一级大片视频|