Mac 下開發 Java 程式二三事

在 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 可以更改為你喜歡的名稱,其它的目錄名稱都必須照著上面的名稱,連大小寫都不能打錯,否則就無法執行了。

    所以在包裝前,就先將目錄的架構建成這樣,然後按照下列的步驟來完成打包:

    1. 把 /System/Library/Frameworks/JavaVM.framework/Versions/
      Current/Resources/MacOS/JavaApplicationStub 複製到 MyApp.app/Contents/MacOS/ 下,你可以將這個檔案保持原來的檔案名稱,或是將它更名為你程式的名稱。
    2. 把你的程式(.jar 檔)、或是其它必備的檔案放到 MyApp.app/Contents/Resources/Java/ 下。
    3. 將應用程式圖示(.icns檔)放到 MyApp.app/Contents/Resources/ 下,可以拿 /Developer/Applications/Java Tools/Jar Bundler.app/Contents/Resources/GenericJavaApp.icns 來使用。
    4. 在 MyApp.app/Contents/ 下建立一個 PkgInfo 檔案,然後內容只有一行,為「APPL????」,如果你在 ADC 上有註冊一個 creator ID,那就把 ???? 更換成你的 ID,否則使用 ???? 就可以了。
    5. 在 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 設成什麼就改一下。

    6. 最後再執行 /Developer/Tools/SetFile -a B MyApp.app 就可以了。

    如果你覺得上面提的方法很難用,或者怎麼弄都弄不起來的話,你可以使用 Xcodes 來開啟 Java 的 project , Xcode build 完後就會產生一個 .app 了!

    參考資料: Java Deployment Options for Mac OS X

  • 功能表的事: 要把功能表列弄到最上方的 Screen Menu 上,參考之前的文章「在Mac 下 Java 程式使用系統功能表列」就可以了。

    用過 Mac OS X 下一般應用程式的人應該都知道,像「About」、「Preferences」或「Quit Application」的 Menu Item 都是放在左上角蘋果圖示右側的主選單中,這部份必須使用 Apple Java Extensions 來完成,下面就用簡單的例子來說明如何在主選單中加上 Preferences 這個 menu item:

    1. 先建立一個 ApplicationAdapter 的 class:

      [code lang="java"]
      import com.apple.eawt.*;
      public class SysMenuAdapter extends ApplicationAdapter {
      public void handlePreferences(ApplicationEvent e) {
      // 處理按下 Preferences 後的動作。
      }
      }
      [/code]

    2. 然後在你的程式裡建立 GUI 介面的地方,加上下列的 code:

      [code lang="java"]
      import com.apple.eawt.*;
      // 如果你的 class 已經 extends Application 的話用 this 就可以了。
      Application app = Application.getApplication();

      // 要有這兩行才會出現 Preferences
      app.addPreferencesMenuItem();
      app.setEnabledPreferencesMenu(true);
      app.addApplicationListener(new SysMenuAdapter());
      [/code]

    其它的就交給你自由發揮囉。不過我目前還不知道要怎麼才能讓 About、Preferences或是 Quit 能夠 localized (比方說改成中文字),如果有人知道的話,希望能不吝賜教。

  • 也許你可以試看看Eclipse……
    我先前有摸索過xcode…
    可是感覺他在設計GUI不是很方便~~~
    而Eclipse則可以拖拉得方式來設計

  • 我一直都有用過 Eclipse 呀,但我個人覺得 Eclipse 拉介面比 JBuilder 或 Netbeans 還弱耶..XD

  • daemon

    請問有沒有辦法動態改icon的圖形?

  • daemon:
    好像不行耶 @@a

  • sevlen

    請問一下,在adc網頁中找不到j2se的開發版,請指點迷津謝謝您。