在 Mac OS X 下開發 Java 程式也是有些事要注意的…
寫在前面
在 Mac OS X 下開發 Java 程式,只要到 Apple Developer Connection (ADC)上下載 J2SE 的開發套件,其它就跟在其它平台上沒什麼不一樣,寫好程式碼,然後用 javac 來編譯,用 java 來執行,或是用 jar 來打包。
當要散佈(deploy)你的程式時,最簡單的方式就是把程式包裝成一個 .jar 檔案,然後使用者只要點擊這個檔案,如果系統上也有安裝好 Java 執行環境,只要程式沒寫錯,恭喜你,這個程式可以被正確地執行。
其實要把 Java 開發的程式散佈到 Mac OS X 上,是可以再把它弄得像一般 Mac OS X 一樣。比方說,若你的應用程式不只有一個 .jar 檔案,那你可能要把它們統統塞進一個 .jar 檔,或者是散佈一個檔案夾,然後教導使用者該點擊哪個檔案才能正確執行,或者像之前的文章「在Mac 下 Java 程式使用系統功能表列」內敘述的功能表列的差異。身為一個軟體開發者,應該多多為使用到這個程式的使用者著想,儘可能地將軟體包裝得像他們一般接觸到的軟體一樣,這樣使用者用起來,才不會覺得又要多學習一種操作習慣了。
所以這篇文章將整理我看了幾篇 ADC 上的文件及自己嚐試後的心得,如果有 Java 程式開發者要散佈軟體到 Mac OS X 上,那這篇文章將對你很有幫助。
本文
- 將你的 Java 程式包裝成 .app 應用程式在 Mac OS X 裡面,應用程式都是一個 .app 的「資料夾」,裡面有程式的執行檔、會用到的資源檔以及一些設定檔。它的目錄架構大致會長成這樣:
MyApp.app/ Contents/ MacOS/ Resources/ Java/其中只有 MyApp.app 可以更改為你喜歡的名稱,其它的目錄名稱都必須照著上面的名稱,連大小寫都不能打錯,否則就無法執行了。
所以在包裝前,就先將目錄的架構建成這樣,然後按照下列的步驟來完成打包:
- 把 /System/Library/Frameworks/JavaVM.framework/Versions/
Current/Resources/MacOS/JavaApplicationStub 複製到 MyApp.app/Contents/MacOS/ 下,你可以將這個檔案保持原來的檔案名稱,或是將它更名為你程式的名稱。 - 把你的程式(.jar 檔)、或是其它必備的檔案放到 MyApp.app/Contents/Resources/Java/ 下。
- 將應用程式圖示(.icns檔)放到 MyApp.app/Contents/Resources/ 下,可以拿 /Developer/Applications/Java Tools/Jar Bundler.app/Contents/Resources/GenericJavaApp.icns 來使用。
- 在 MyApp.app/Contents/ 下建立一個 PkgInfo 檔案,然後內容只有一行,為「APPL????」,如果你在 ADC 上有註冊一個 creator ID,那就把 ???? 更換成你的 ID,否則使用 ???? 就可以了。
- 在 MyApp.app/Contents/ 下建立一個 Info.plist 檔案,最簡單的方式可以去複製 /Developer/Applications/Java Tools/Jar Bundler.app/Contents/Resources/ 下的 Info.plsit 檔案,然後修改裡面幾個鍵值(key 之後對應 value,而 value 的 type 有可能是 string 、dict、array 等等),值得注意的鍵值如下所示:
CFBundleExecutable: 這表示在 MyApp.app/Contents/MacOS/ 下的執行檔名稱,如果你在步驟 1 裡沒有把 JavaApplicationStub 更名的話,這裡就使用 string value: JavaApplicationStub,否則就是你改過的名字。
MainClass: 就是你程式的 main class 的名稱,如果你有使用 package,這裡要打出完整的名稱(如:foo.bar.Main)。 其它的設定應該可以直接看現成的 Info.plist 設成什麼就改一下。
- 最後再執行 /Developer/Tools/SetFile -a B MyApp.app 就可以了。
如果你覺得上面提的方法很難用,或者怎麼弄都弄不起來的話,你可以使用 Xcodes 來開啟 Java 的 project , Xcode build 完後就會產生一個 .app 了!
- 把 /System/Library/Frameworks/JavaVM.framework/Versions/
- 功能表的事: 要把功能表列弄到最上方的 Screen Menu 上,參考之前的文章「在Mac 下 Java 程式使用系統功能表列」就可以了。
用過 Mac OS X 下一般應用程式的人應該都知道,像「About」、「Preferences」或「Quit Application」的 Menu Item 都是放在左上角蘋果圖示右側的主選單中,這部份必須使用 Apple Java Extensions 來完成,下面就用簡單的例子來說明如何在主選單中加上 Preferences 這個 menu item:
- 先建立一個 ApplicationAdapter 的 class:
import com.apple.eawt.*; public class SysMenuAdapter extends ApplicationAdapter { public void handlePreferences(ApplicationEvent e) { // 處理按下 Preferences 後的動作。 } }
- 然後在你的程式裡建立 GUI 介面的地方,加上下列的 code:
import com.apple.eawt.*; // 如果你的 class 已經 extends Application 的話用 this 就可以了。 Application app = Application.getApplication(); // 要有這兩行才會出現 Preferences app.addPreferencesMenuItem(); app.setEnabledPreferencesMenu(true); app.addApplicationListener(new SysMenuAdapter());
其它的就交給你自由發揮囉。不過我目前還不知道要怎麼才能讓 About、Preferences或是 Quit 能夠 localized (比方說改成中文字),如果有人知道的話,希望能不吝賜教。
- 先建立一個 ApplicationAdapter 的 class:
文章分類:
標籤:


2006/10/05 9:39 am
也許你可以試看看Eclipse……
我先前有摸索過xcode…
可是感覺他在設計GUI不是很方便~~~
而Eclipse則可以拖拉得方式來設計
2006/10/05 10:25 am
我一直都有用過 Eclipse 呀,但我個人覺得 Eclipse 拉介面比 JBuilder 或 Netbeans 還弱耶..XD
2007/07/12 12:29 am
請問有沒有辦法動態改icon的圖形?
2007/07/13 12:10 am
daemon:
好像不行耶 @@a