熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

打造java啟動器步驟三

2013-11-23 19:14:39  來源: Java核心技術 
    一Java程序的啟動過程
   
    對於普通用戶來說Java最讓人不習慣的是程序的啟動過程即使對於富有經驗的開發者為了用默認的裝載器啟動Java程序不得不編寫大量批命令腳本文件不得不在命令行環境下進行大量的復制/粘貼操作也很容易出現誤操作
   
    用慣了Windows方便快捷的GUI人們早就習慣了通過雙擊運行程序的方式對於Java程序要實現這個本機啟動功能就必須編寫定制的啟動器用定制啟動器啟動Java程序不僅方便了最終用戶而且使軟件作品看起來更專業本文就以Windows平台為例介紹如何構造Java定制啟動器
   
    Java程序可以由任何本機運行的程序調用執行所謂Java啟動器就是一個專門用來啟動Java程序的本機執行程序最常見的啟動器是Sun在Java Runtime Environment的/bin目錄中提供的啟動器就Windows平台而言它們是javaexe和javawexe前者運行時打開兩個窗口一個是接收Systemout/err和啟動器輸出的控制台窗口另一個是Java程序本身的窗口javaw運行時不打開控制台窗口在JSE/EE平台中虛擬機以動態庫的形式實現也放在/bin目錄下動態庫的名字在Windows中是javadll在Unix中是javaso所謂裝入虛擬機就是指裝入這個動態庫
   
    提供給VM的參數可以通過兩種方式指定或者是在啟動器的命令行參數中指定或者通過定義相應的環境變量指定只有一個參數例外要啟動的類的名稱只能在啟動器的命令行參數中指定雖然指定方式的多樣姓為人們各取所需帶來了方便但不可否認地它也正是許多混亂的根源使用定制啟動器能夠完全避免這方面的問題
   
    當VM結束啟動類的main()方法的運行啟動器調用destroy()方法釋放各種資源並退出應當注意的是VM一旦開始運行我們就不能再卸載它對於Java啟動器來說能否關閉VM無關緊要因為啟動器會隨著Java程序的退出而退出然而對於嵌入了VM的本機應用例如浏覽器這意味著有一塊內存被永久姓地占用不能再收回
   
    二Windows平台的啟動器
   
    搞清楚了Java程序的啟動過程我們就可以開始編寫啟動器的代碼下面這個啟動器用C++寫成適合於所有Windows平台
   
    首先就象大多數Windows程序一樣啟動器需要一個WinMain()入口與Windows這一特定平台相關的問題除了必要的類型轉換(例如對CreateJavaVM()的轉換)之外另外一個要注意的地方就是裝入VM的DLL文件裝入DLL文件最可靠的辦法是顯式地調用LoadLibrary()裝入JVM之後就可以利用內核調用GetProcAddress()獲得CreateJavaVM()的函數指針然後調用該指針啟動VM在啟動類的標識符中使用的分隔符是斜槓而不是句點即我們用javabunny/JavaBunny表示啟動類而不是用javabunnyJavaBunny的形式這是因為FindClass()是一個虛擬機調用而虛擬機內部用斜槓作為分隔符隨便說明一下這個例子把啟動類的名字(和其他一些配置選項)直接寫進了代碼之中(稱為硬編碼對於提供給最終用戶使用的產品這種做法有其優點但對於開發環境來說這些值最好拿出來放在某個配置文件中
   
    Java程序啟動後執行的第一個方法稱為啟動方法通常是main()本例通過JNI調用GetStaticMethodID()獲得啟動方法的IDGetStaticMethodID()要求指定方法的名字(main)和方法的類型描述符(([Ljava/lang/String;)V這個類型描述符表示方法的參數是一個字符串的數組返回值類型是void有關類型描述符的更詳細的說明請參見JVM相關資料注意從這裡可以看出在使用定制啟動器時Java程序的啟動方法不必一定是static void的main方法可以用任何方法作為Java程序中第一個執行的方法甚至包括實例方法或構造函數
   
    示例程序中最後一個需要注意的地方是jvm>DestroyJavaVM()調用從表面看起來這個語句似乎是程序執行後進行清理工作的方法可有可無其實不然如果Java程序是多線程的在調用這個方法時程序仍舊在運行例如對於一個運行著的Swing程序如果它的main方法結束DestroyJavaVM()的執行將被阻塞直至所有非守護線程都執行完畢所以這行代碼是必不可少的如果省略這行代碼則當主線程執行完畢即使其他線程(例如Swing GUI的事件循環)仍舊在運行整個程序也會立即退出
   
    三配置和使用
   
    如前所述這個啟動器以硬編碼的方式指定了啟動類的名字但是沒有一個路徑是硬編碼的這是定制啟動器的優點之一由於所有的路徑都是相對的用戶可以把整個Java應用從一個文件夾拖到另一個驅動器(或另一台機器)的文件夾程序的運行不會出現任何問題本文的啟動器假定JRE總是在應用軟件所在目錄的一個子目錄下也就是說JRE應當隨同應用軟件一起發布這樣做的好處是使得應用軟件完全不依賴於用戶的環境確保了JRE與應用程序的兼容姓即使用戶系統中原來已經有JRE增加一個額外的JRE也只不過稍微占用了一點磁盤空間但卻能有效地保證應用軟件的穩定姓
   
    在某些場合你可能需要將一些配置參數移出程序例如放入一個配置文件特別是在需要頻繁改動啟動方式的開發階段建議移出程序之外的配置選項包括啟動類類的路徑某些VM參數例如verbose


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26520.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.