欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
使不能運行的JAR文件可以使用java -jar運行
http://school.cnd8.com/java/jiaocheng/18475.htm
 
  摘要
  
  本文展示如何將不可運行的JAR變?yōu)榭蛇\行的,并且不用直接操作manifest文件。你將學(xué)會(huì )開(kāi)發(fā)一個(gè)短小的程序使得任何JAR文件都可以使用java -jar命令或者通過(guò)在像Windows上雙擊而運行。
  
  你可以將一個(gè)應用的所有類(lèi)和資源打包到一個(gè)JAR文件中。實(shí)際上,那就是jar文件的一個(gè)目的。另外一個(gè)目的是讓用戶(hù)可以非常輕易的執行存儲在JAR文件中的應用,那么為什么當他們可以成為一等公民而和本機可執行程序等同的時(shí)候,我們?yōu)槭裁匆屗麄冎怀袚墓δ芏蔀閖ava世界中的二等公民呢?
  
  要執行一個(gè)jar文件,你可以使用java命令的-jar選項。例如你有一個(gè)可運行的文件名為myjar.jar的JAR文件,因為它是可運行的,你可以像這樣執行它:java -jar myjar.jar
  
  另外,當JRE安裝在像Windows這樣的操作系統上時(shí),將jar文件和JVM關(guān)聯(lián)后你就可以雙擊他們運行應用了。這些JAR必須是可運行的。
  
  問(wèn)題是:你如何讓一個(gè)JAR是可運行的?
  
  
  manifest文件和Main-Class條目
  
  在大部分JAR文件中,META-INF目錄下會(huì )有一個(gè)MANIFEST.MF文件,在那個(gè)文件中有一個(gè)非凡的條目Main-Class,它告訴java -jar命令去執行那么類(lèi)。
  
  問(wèn)題是你必須自己恰當的將這個(gè)非凡條目加到manifest文件中:它必須位于特定的位置并且必須符合特定的格式,然而有些人不喜歡編輯配置文件。
  
  
  讓API幫你做
  
  從Java 1.2開(kāi)始引人的java.util.jar包可以讓你操作jar文件(注重:它建立在java.util.zip包的基礎上)。更確切的說(shuō)法是,java.util.jar可以讓你通過(guò)Manifest類(lèi)非常輕易的操作那個(gè)非凡的manifest文件。
  讓我們編寫(xiě)一個(gè)程序使用那個(gè)API。首先這個(gè)程序必須知道三件事情:
  
  1. 我們希望可以執行的JAR
  2. 我們希望執行的主類(lèi)(這個(gè)類(lèi)必須存在于JAR內)
  3. 新的JAR文件的文件名,因為我們不應該簡(jiǎn)單的覆蓋那些文件
  
  
  編寫(xiě)程序
  
  上面的列表將會(huì )構成我們的程序的參數,基于這一點(diǎn),讓我們?yōu)檫@個(gè)應用挑選一個(gè)合適的名字。MakeJarRunnable聽(tīng)起來(lái)如何?
  
  
  檢查main的參數
  
  假設我們的main入口是一個(gè)標準的main(String[])方法,我們首先應該檢查程序的參數:
  
   if (args.length != 3) { System.out.println("Usage: MakeJarRunnable " + " "); System.exit(0); }
  
  請注重參數列表是如何被解釋的,因為這對于后面的代碼是非常重要的。參數的順序和內容并不是硬性設置的,但是假如你改變它們也要記得適當的修改其他的代碼。
  
  
  訪(fǎng)問(wèn)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對象獲得了這個(gè)屬性集我們就可以設置適當的主類(lèi)。然而假如一個(gè)Main-Class屬性已經(jīng)存在于原來(lái)的JAR時(shí)怎么辦?這個(gè)程序簡(jiǎn)單的打印一個(gè)警告并退出?;蛟S我們可以增加一個(gè)命令行參數告訴程序用新的值替換已經(jīng)存在的那個(gè)值.
  
   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 )建一個(gè)新的jar文件,因為我們必須使用JarOutputStream類(lèi)。注重我們必須保證沒(méi)有將輸入作為輸出使用。作為替代,也許程序應該考慮兩個(gè)jar文件相同并且提示用戶(hù)是否覆蓋原來(lái)的。然而我將這個(gè)保留給讀者作為練習。
  
   System.out.println("Writing to " + args[2] + "..."); JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(args[2]), manifest);
  
  我們必須將原來(lái)的JAR中的每個(gè)條目都寫(xiě)到新的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();
  
  
  完整程序
  
  當然我們必須將這些代碼放到一個(gè)類(lèi)里面的main方法里面,并且具有合適的import聲明。
  
  
  使用范例
  
  讓我們用一個(gè)范例來(lái)使用這個(gè)程序。假設你有一個(gè)應用其main入口點(diǎn)是類(lèi)HelloRunnableWorld(這個(gè)是它的全類(lèi)名,也就是包含包名),同樣假設你已經(jīng)創(chuàng )建了一個(gè)名字為myjar.jar的JAR,包含整個(gè)應用。對于這個(gè)jar,我們像這樣運行MakeJarRunnable:
  
  java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar
  
  再強調一次,就像早先提到的,注重參數列表的順序。假如忘記了順序,以無(wú)參的形式運行程序它就會(huì )告訴你使用信息。
  
  使用java -jar命令運行myjar.jar和myjar_r.jar,注重它們的差異。完成這些之后,查看一下它們的manifest文件(META-INF/MANIFEST.MF)。
  
  這里有一個(gè)建議:將MakeJarRunnable制作成一個(gè)可以運行的JAR!
  
  
  運行它
  
  通過(guò)雙擊一個(gè)JAR或者使用簡(jiǎn)單的命令總是比將它包含在你的classpath并運行特定的main類(lèi)方便。為了幫助你作到這一點(diǎn),JAR規范為JAR的manifest文件提供了一個(gè)Main-Class屬性。我在這里提出的這個(gè)程序讓你利用Java的JAR API非常輕易的操作這個(gè)屬性并制作你自己的可運行的JAR。
  
(#)
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
idea打jar包沒(méi)有MANIFEST文件坑
怎樣使jar包里的類(lèi)能讀取同在此jar包中的一個(gè)xml文件
java打包詳解
用myeclipse打jar包,使其包含依賴(lài)jar包的指向
-- [原創(chuàng )]把.class用jar工具打包成可執行程序
用 One-JAR 簡(jiǎn)化應用程序交付
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久