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

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

分享:讓Java程序帶著jre一起上路

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

  用java開發程序,發布時總要考慮的問題就是怎么在使用者的機器上裝好JRE。要考慮的問題很多:使用者有沒有能力獨自安裝JRE,使用者已有的JRE和我們需要的版本是不是一致,會不會出現版本問題,等等。
  
  使用.NET要考慮的問題就少些。現在.NET CLR似乎已經很普及了,看好多D版的Win XP都會自己安裝最新的.NET CLR,而且似乎它的安裝界面也比JRE友好些。徹底解決安裝JRE的問題的方案,就是讓我們的應用程序自己背著JRE!這樣,我們的程序就像傳統的Win32應用程序一樣,雙擊就可以執行,不用管所在的機器上是否有JRE,是什么版本的JRE,無論怎樣,我有我自己的!要做到這一點,其實非常輕易。
  
  王森在他的《Java深度歷險》(強力推薦這本書,內容少而精)的第一章就解釋了JDK,JRE,JVM之間的關系。解釋了我們執行java.exe時發生的事情。其中提到,java.exe依照一套邏輯來尋找可以用的JRE,首先查找自己所在的目錄下有沒有JRE(據王森講這樣說不確切,我沒有JDK全部的源代碼,在此無從考證);其次查找自己的父目錄下有沒有JRE;最后才是查詢Windows的注冊表。
  
  通常我們在安裝好了JRE的機器上的任何一個目錄下都可以執行java.exe。因為它在安裝時被復制到了windows的system32目錄下,而后者無論如何都會在path環境變量中。這個java.exe最終必然會訪問注冊表來確定真正的JRE的所在地。若我們要求每一個應用程序都自帶JRE,必然不能走這條路。但,邏輯的第二條講,java.exe會在它的父目錄下查找JRE,解決方案就在這一條中。
  
  假設我們的應用程序打好了包,叫做MyApp.jar,放在MyApp的目錄下。我們在MyApp目錄下,可以執行java –jar MyApp.jar來運行我們的程序。我們安裝的是JRE 1.5,在C:/PRogram Files/Java/jre1.5.0下?,F在,我們只需要簡單的將jre1.5.0目錄搬到MyApp目錄下,順便改個輕易寫的名字比如叫jre。現在,我們的應用程序就象這樣:
  
  MyApp
  MyApp.jar
  Jre
  Jre1.5.0目錄下的全部內容
  
  Java.exe就在jre目錄下的bin目錄中。根據第二條邏輯,java.exe會在它的父目錄中查找jre,實驗證實,它會查找lib目錄,而lib就在jre目錄下。因此,這樣java.exe就會確定jre的所在然后正常執行java程序,不會去管我們是否安裝了JRE,注冊表中是否有注冊項這些雜事了。
  
  試一下,在命令行下進入MyApp的目錄下,假設它在C盤,將path指向MyApp下的JRE:
  set path=c:/MyApp/jre/bin
  
  然后運行:
  java –verbose –jar MyApp.jar
  
  加上verbose參數以確定我們確實用了這一套被搬出了家的JRE。
  
  程序可以運行,并且在命令行輸出的前幾行,可以看到:
  
  [Opened C:/MyApp/jre/lib/rt.jar]
  [Opened C:/MyApp/jre/lib/jsse.jar]
  [Opened C:/MyApp/jre/lib/jce.jar]
  [Opened C:/MyApp/jre/lib/charsets.jar]
  
  因此程序讀取的確實是它的私有的JRE。
  
  至此,我們似乎完成了任務。但是現在我們的私有JRE仍不完美,缺點是太大。JRE 1.5有接近70MB,作為我們的私有的JRE,好多內容都是可以拋棄的。Jre目錄下的license都可以不要,bin下的執行文件只需要保留java.exe或者javaw.exe,lib下只要保留rt,jsse,jce,charsets幾個庫就可以了。除了i386和zi兩個子目錄外,其余的子目錄都可以不要。Zi下只需要保留自己地區的子目錄和其下的一些文件就可以。Lib下除了庫之外的屬性文件等等都要保留。這樣清理一番,JRE仍然有接近50MB。還可以繼續清理幾個庫文件里面不需要的內容,這需要仔細的整理,會很費功夫。最好能寫出一個自動工具幫助我們整理它們。從Sun公司上下到的JMF里面附帶的用Java寫的媒體播放器就自帶了JRE,只有幾個MB。
  
  清理過后需要運行幾遍我們的應用程序,以確保我們的JRE不缺少東西。
  
  假如我們希望能有一個程序直接啟動我們的應用程序,那就還要費些功夫。最簡單的方法是弄出一個快捷方式來,但是快捷方式的路徑不能是相對的,不方便我們安裝。我想到的方案就是用Win32程序包裝一下。在VS.NET下寫一個Win32小程序:
  
  int PASCAL WinMain( HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPSTR lpszCmdLine,
  int nCmdShow ){  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory( &si, sizeof(si) );
  si.cb = sizeof(si);
  ZeroMemory( &pi, sizeof(pi) );
  // Start the child process.
  if( !CreateProcess( "jre//bin//javaw.exe",//執行的程序名
  "jre//bin//javaw.exe -jar MyApp.jar", // 帶參數的執行程序
  NULL,
  // Process handle not inheritable.
  NULL,
  // Thread handle not inheritable.
  FALSE,
  // Set handle inheritance to FALSE.
  0,
  // No creation flags.
  NULL,
  // Use parent's environment block.
  NULL,
  // Use parent's starting Directory.
  &si,
  // Pointer to STARTUPINFO strUCture.
  &pi )
  // Pointer to PROCESS_INFORMATION structure.  )
  {      ErrorExit( "CreateProcess failed." );
  }   // Wait until child process exits.  WaitForSingleObject( pi.hProcess, INFINITE );
  // Close process and thread handles.
  CloseHandle( pi.hProcess );
  CloseHandle( pi.hThread );}
  
  基本上是按照MSDN文檔中的例子照搬的。將它編譯成一個EXE文件,我們的任務才全部完成。雙擊這個EXE文件,我們的程序啟動了,看起來和傳統的Win32程序沒有兩樣,JRE完全被隱藏在底層。
  
  P.S. 使用了這個方案后,我用Wise Installation System制作安裝程序,發現一個非常希奇的問題,安裝結束后,安裝程序似乎非要運行一個叫做GLJ什么什么,后綴是TMP的程序,還需要JVM,結果就報錯JVM.DLL找不到。安裝總是不成功。我已經禁掉了OCX / DLL / EXE自注冊和卸載支持,為什么還不對?有誰知道是為什么嗎?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
孩xxxx性bbbb欧美| 欧美孕妇性xx| 欧美一级免费视频| 日韩欧美亚洲一二三区| 久久69精品久久久久久久电影好| 岛国精品视频在线播放| 亚洲日本中文字幕免费在线不卡| 中文字幕亚洲激情| 欧美资源在线观看| 久久视频免费在线播放| 91久久精品久久国产性色也91| 欧美成人黑人xx视频免费观看| 国产精品久久91| 日韩成人激情在线| 国产日韩欧美在线视频观看| 69久久夜色精品国产69乱青草| 色狠狠av一区二区三区香蕉蜜桃| 97精品国产97久久久久久| 91av免费观看91av精品在线| 欧美日韩一区二区三区在线免费观看| 亚洲va欧美va国产综合久久| 蜜臀久久99精品久久久无需会员| 欧美丰满老妇厨房牲生活| 久久久人成影片一区二区三区观看| 亚洲自拍偷拍福利| 日韩免费黄色av| 欧美资源在线观看| 中文字幕欧美精品日韩中文字幕| 亚洲在线视频福利| 欧美激情国内偷拍| 国产精品99久久久久久www| 国产精品aaaa| 国产精品人成电影| 国产亚洲免费的视频看| 中日韩美女免费视频网站在线观看| 最近2019中文字幕mv免费看| 欧美专区在线播放| 欧美视频专区一二在线观看| 一区二区三区四区在线观看视频| 日韩中文字幕第一页| 欧美激情精品久久久| 97在线观看视频国产| 国产精品国模在线| 亚洲高清一二三区| 黑人巨大精品欧美一区二区一视频| 精品久久久久久中文字幕大豆网| 久久免费高清视频| 久久久久久久久久久免费精品| 国产日韩精品一区二区| 色av中文字幕一区| 亚洲区在线播放| 亚洲一区二区三区四区视频| 欧美另类极品videosbest最新版本| 麻豆乱码国产一区二区三区| 日本成人在线视频网址| 亚洲国产又黄又爽女人高潮的| 中文字幕一区二区三区电影| 午夜精品久久久久久99热软件| 色av中文字幕一区| 亚洲欧洲在线视频| 国产欧美亚洲视频| 91精品久久久久久久久不口人| 97视频在线观看网址| 欧美www视频在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 成人免费午夜电影| 国产成+人+综合+亚洲欧美丁香花| 久久久久国色av免费观看性色| 亚洲视频在线视频| 精品香蕉一区二区三区| 午夜精品一区二区三区在线| 国产精品自产拍高潮在线观看| 国产精品久久二区| 国产精品青草久久久久福利99| 红桃av永久久久| 欧美精品18videosex性欧美| 欧美日韩中文字幕| 美女撒尿一区二区三区| 97视频在线播放| 欧美日韩激情视频8区| 国产精品十八以下禁看| 日韩精品免费看| 欧美与欧洲交xxxx免费观看| 91日本在线视频| 国产欧美va欧美va香蕉在线| 久久乐国产精品| 精品亚洲夜色av98在线观看| 久久久影视精品| 国产999在线| 日韩高清有码在线| 九九久久精品一区| 国产精品精品一区二区三区午夜版| 久久免费视频观看| 日产精品久久久一区二区福利| 国产精品欧美风情| 国产精品电影网| 91精品国产高清自在线| 国产精品久久久久久av下载红粉| 色综合久久88色综合天天看泰| 亚洲国产小视频| 国产99在线|中文| 亚洲国产精品99久久| 欧美一级片在线播放| 在线观看欧美www| 久久久久国产精品免费| 欧美在线一级视频| 亚洲综合第一页| 日韩欧美一区二区三区久久| 亚洲风情亚aⅴ在线发布| 午夜精品视频在线| 国产成人欧美在线观看| 这里只有精品在线播放| 日本国产高清不卡| 欧美福利视频网站| 91深夜福利视频| 亚洲区在线播放| 亚洲的天堂在线中文字幕| 亚洲女人被黑人巨大进入| 久操成人在线视频| 97精品国产97久久久久久春色| 久久99国产综合精品女同| 欧美超级免费视 在线| 成人亚洲欧美一区二区三区| 日韩av一区二区在线| 亚洲片在线资源| 国产视频久久久久久久| 成人性生交大片免费看视频直播| 亚洲国产精品一区二区三区| 97精品久久久| 欧美激情中文网| 一区二区av在线| 韩国美女主播一区| 午夜精品一区二区三区在线| 亚洲精品成人免费| 亚洲v日韩v综合v精品v| 国产精品亚洲精品| 伊人久久久久久久久久久久久| 日韩精品中文字| 国产成人精品av在线| 91高潮精品免费porn| 欧美裸体xxxx极品少妇| 免费97视频在线精品国自产拍| 国产成人久久久| 久久久久久久色| 91精品久久久久久久久久| 久久久久久久久久久免费| 免费99精品国产自在在线| 日韩中文字幕在线视频播放| 亚洲伊人成综合成人网| 国语自产精品视频在线看一大j8| 日韩欧中文字幕| 日韩在线视频导航| 欧美丝袜美女中出在线| 亚洲欧美在线x视频| 亚洲人成网站在线播| 久久久久久这里只有精品| 亚洲欧美一区二区三区久久| 欧美日韩国产在线看| 欧美激情一区二区三区成人| 91九色国产视频| 精品久久久精品| 97不卡在线视频| 亚洲精品一区久久久久久| 91精品国产成人www|