2013-01-23 67 views
6

我必須發佈帶有嵌入式JRE的swing應用程序。使用應用程序+ JRE + .bat/.sh的壓縮歸檔爲Windows和Linux做了訣竅。用戶下載zip文件,解壓縮並啓動應用程序。完善。將JRE嵌入到Mac OS X的Swing應用程序中

但是現在我必須爲Mac OS X提供同樣的東西。我已經讀過/被告知過很多不同的事情(禁止在Mac上分發JRE,相反,總有JRE在Mac等),所以我對我可能做的事情感到非常困惑。

有沒有人做過這樣的事情?你是如何解決Mac應用程序部署的?作爲獎勵,在Mac(zip?)中分發我的應用程序的最佳格式是什麼?

+2

您是否試過[Excelsior JET](http://www.excelsior-usa.com /jet.html)? – 2013-01-23 15:20:25

+1

Launch4j怎麼樣?並檢查[this](http://stackoverflow.com/questions/9761518/macos-executable-of-a-jar-file) –

+0

@NikolayKuznetsov Launch4J僅用於構建Windows'.exe'發射器。啓動程序的_building_可以在Mac/Linux上完成,但生成的啓動程序只能在Windows上運行。 –

回答

1

我認爲你可以放心地假設JRE已經存在於Mac上。

最好的格式(所以我被告知 - 我不是Mac用戶本人)是一個tar.gz(保留文件屬性)的「應用程序」包。

您可以使用「jarbundler」(http://sourceforge.net/projects/jarbundler/)創建一個合適的Mac「捆綁包」,該捆綁包可以不需要進一步提取。確保Ant tar任務中捆綁包中包含的存根已標記爲「可執行」。

如果安裝了多個JRE,我認爲存在一些問題。在這種情況下,必須使用正確的Stub來啓動應用程序需要的JRE版本。如果我沒有記錯這個存根位於/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub

有一個頁面,表明有可能與Java7的問題和jarbundler:http://informagen.com/JarBundler/

+0

「我必須*通過嵌入式jre *發送一個swing應用程序*」可能意味着對已安裝的內容的任何假設都是毫無價值的。 – OrangeDog

+0

@OrangeDog:但是OP也聲明:「*所以我對我可能做的事情非常困惑*」 –

+1

@a_horse_with_no_name你不能安全地假設一個JRE總是存在於Mac上。正如您現在在10.8.2上看到來自Apple的最新Java更新一樣,它們完全從提供Java 6 System包的過程中消失。 –

3

看一看java.net上的appbundler項目。它提供了一個Ant任務,將您的應用程序打包爲一個普通的Mac .app包,並可以選擇包含嵌入式JRE。

由於我們仍然處於Java 6版本由Apple提供和維護並且Java 7版本直接來自Oracle的過渡時期,因此Mac上的整個Java環境目前有點混亂。 a_horse_with_no_name中提到的jarbundler項目是用於將JAR包裝爲.app捆綁包,該捆綁包可以在Mac OS X 10.5/6/7附帶的Apple提供的Java 6上運行,但不能在Oracle Java 7上運行,相反,它們是appbundler目標Oracle Java 7及其.app捆綁包將無法在Java 6上運行。

如果要定位運行10.7或10.8的近期Mac,特別是如果要通過Mac App Store分發應用程序,則應該使用appbundler並捆綁JRE的副本。如果您不想通過商店進行分發,那麼嵌入式JRE是可選的。如果您的應用程序可以在Java 6上運行,那麼使用jarbundler將Apple Java 6作爲目標意味着您的應用程序可以在較舊的(< = 10.6)Mac上運行。但是,那些只有Java 7的最新版Mac的用戶在嘗試運行應用程序時會被提示下載並安裝Java 6。

它的優良的.zip存檔分發.app,只要在Contents/MacOS目錄(在嵌入式JRE相應的文件,如果適用)的應用程序內的一切標有zip文件的執行權限。如果您使用Ant構建,則需要使用<zipfileset> s,並使用filemode

+0

如果我沒有弄錯,那麼使用'jarbundler'來定位哪個Java版本只是包含了Stub的一個問題。所以如果能夠得到Java7的Stub,那麼也可以用於jarbundler。我這樣做是爲了從Java5升級到Java6(顯然是在其他Mac用戶的幫助下)。 ZIP文件將不起作用,因爲您無法在ZIP文件中指定執行權限,只能在tar文件中指定。 –

+1

@a_horse_with_no_name Java 7沒有存儲與Java EE使用的Info.plist格式兼容的存根,Oracle版本使用不同的API從存根中啓動VM。一個ZIP文件_can_擁有權限信息(從技術上說,它是一個infozip擴展,而不是核心規範的一部分,但它是一個事實上的標準)。 –

+0

啊,我不知道那個存根。但我從來沒有見過一個包含文件權限的ZIP文件(我認爲Ant的zip任務根本不支持它)。你能給我一個參考嗎? –

2

最簡單方法使用與通過Java Web Start部署的任何其他平臺相同的JAR。我從來沒有嘗試過使用它來安裝JRE。

best提供Mac友好體驗的方法要求您將JAR包裝在應用程序包中,在文章的引用here中進行了討論。優選的遞送格式是壓縮的disk image.dmg

文章Java Deployment Options for Mac OS X比較了這兩個選項。這個game是一個可以以任何方式啓動的例子。

附錄:爲了好奇,Mac OS X Finder將.jnlp文件視爲文檔,默認情況下使用JWS啓動器打開。我在碼頭文件夾中保留了一些經常使用的.jnlp文件的文件夾以便快速訪問。 Java首選項控制面板允許管理緩存的應用程序。選擇安裝快捷方式會在目標文件夾中創建一個簡單的Mac應用程序捆綁包,並且可以像其他編輯一樣對其包含的Info.plist進行編輯。定製.plist的決定取決於應用程序需要什麼功能:屏幕菜單欄,擴展塢名稱和圖標,JNI路徑等。

+0

該比較列表完全正確的OS X應用程序包? OTOH 1)a)不要JWS桌面快捷方式工作? b)不要使用JWS應用程序。出現在Windows的「添加/刪除程序」小程序的OS X等價物中? 2)這不可能嗎? 3)圖標!給我休息一下。4)沒有理由。 5)通過指定對JNLP的興趣可以獲得文檔類型。因此,在這份名單中有幾個可疑的,一兩個真正令人懷疑的陳述。進一步的澄清,將不勝感激 –

+1

@AndrewThompson:我試圖闡述我的(最近獲得的)對1)a和b的理解。我將不得不在2)到5)更近一點。 – trashgod

相關問題