2013-06-06 6 views
9

MacのCocoa(サンドボックス)アプリケーションにJavaランタイムを埋め込む方法を知っている人は誰でも、Javaを別途インストールしなくても.jarファイルを実行できますか?Javaランタイムをサンドボックス化されたCocoa Macアプリケーションに埋め込む

私たちは、Mac App Storeを通じて販売されているココアのアプリケーションだけでなく、Javaを特定のタスクに使用できる独自のサイトで販売しています。筆記用アプリであり、.doc、.docx、.odtの標準NSTextエクスポータは非常に限られているので(ヘッダー、フッター、イメージなどはサポートしていません)、RTFに書き出してからJavaベースのコンバータを使用します。 com)を使用してRTFを.doc、.docxまたは.odtに変換します。

これは、NSTaskを使用して/ usr/bin/javaを呼び出し、変換ルーチンを実行するバンドルされた.jarファイルを実行することで行います。これはすべて、JavaがユーザーのMacにインストールされている限り、美しく機能します。それがインストールされていない場合、私たちのアプリは、エンハンストコンバータの恩恵を受けるためにJavaをインストールするかどうか、またはNSText損失コンバータに後戻りするかどうかをユーザーに尋ねます。ユーザーがJavaのインストールを選択した場合、java_home --requestを呼び出してOS XのJavaインストーラを呼び出します。

しかし、AppleがJavaの直接サポートを終了した(または終了する)ので、このアプローチは問題があります。最後のMac App Storeのレビューで、すぐにユーザーにJavaをインストールするかどうかを尋ねることをやめる必要があるという声が聞かれました。私はAppleの推奨ルートが、Javaを実行する必要があるCocoaアプリケーションにJava Runtime Environmentを埋め込むことだと読んでいます。 (Eg:http://lists.apple.com/archives/java-dev/2011/Jul/msg00038.html

私はここ数日間、私のアプリにJREを埋め込む方法を研究していましたが、私はどのようにそのように行うべきかについての指示はありませんでした私は少なくとも理解する。程度が答え、しかし

Bundling a private JRE on Mac OS X

、そして私が見つけた他のサイトで、すべてのMacアプリケーションとして、Javaアプリケーションをバンドルについてです、ではない:誰かが数年前にここに同様の質問を既存のCocoaアプリケーションを使用したJREも含まれます。 (Javaの経験が不足しているということは、自分の目的に沿って命令を変換する方法が分からないことを意味するかもしれませんが、私をXcodeから取り出して、私は快適ゾーンから抜け出しています)。https://wikis.oracle.com/display/OpenJDK/How+to+embed+a+.jre+bundle+in+your+Mac+app

これはCyber​​duckなどいくつかのアプリケーションで行われているようですが、まだ誰もプロセスを文書化していないようです。私が読んだことから、私はと思っています OracleのJDKまたはOpenJDKからJava仮想マシンを取得し、それを私のCocoaアプリケーションに組み込み、その中からJavaを呼び出す必要がありますが、そうした場合、Java実行ファイルがJVMのコピーはサンドボックス化されないので、私のアプリはMASレビュープロセスを通過しません。おそらく、私は何とかJDKのコピーを作成し、それをサンドボックスにする必要があります。これはおそらく、私のより大きなXcodeプロジェクトの一部です。私はどこから始めたらいいかわからない。私はそれがまだ早い時期であり、多くのMac開発者はまだこれをやらなければならないと思います。

誰かがJREをCocoaアプリケーションに組み込んで、NSTaskを使ってJREを呼び出すことができるようになった経験はありますか? JREは完全にサンドボックス化されており、Mac App Storeで受け入れられるようになっていますか?または、別のJavaインストールを必要とせずに.jarファイルを実行するサンドボックス化されたCocoaアプリケーションを誰も作成できましたか?もしそうなら、あなたはそれをどうやって分かち合うのですか?

(私はAppleがこれに助けを求めて開発者の技術サポートインシデントを取り出したが、彼らは、Javaは現在、サードパーティの開発環境と考えられていることを考えると、全く助けることができなかったことを言われました。)

私が見逃している可能性のあるウェブページへの提案や指針については、事前に多くの感謝をします。

+1

それはあなたが特定のケースで好き_looks_より一般的な「サンドボックス内の補助実行ファイルを使用する方法」の問題。 JREのエンタイトルメントを指定したり、http://www.codeotaku.com/journal/2012-10/code-signing-auxiliary-executables/indexに記述されているようにコード署名することは問題ではありませんか? –

+0

多くの感謝!私はリンクがちょうど私が必要としたものだと思う。 (そして、別の実行可能ファイルで直面していた問題も解決しています。)したがって、私のアプローチは、OracleのサイトからJREを私のアプリケーションでバンドルします。 10.6以降では、OS Xの組み込みバージョンのJavaを呼び出します(デフォルトでは10.6にインストールされ、OracleのJRE 7は10.7以降でのみ動作します)。 10.7以降では、アプリケーションに組み込まれているJREを呼び出し、codeotakuリンクのメソッドを使用してJava実行可能ファイルをサンドボックスします。指が通過してレビューを通過する。再度、感謝します! – kayembi

答えて

1

アップルのエンジニアが、Javaランタイムを「埋め込む」ように言っているときは、「別の実行可能ファイルをバンドルにバンドルして、別々に実行する「自分のプロセス内でJava VMをスピンアップして、そのVMで必要なものを実行する」という意味で「プロセス」を実行します。 Javaを別のプロセスで実行するよりも、これを実行するのはおそらく面倒ですが、可能です。

NSJavaVirtualMachineクラスをご覧ください。ユーザーがJavaをインストールしていない場合でも、Javaランタイムを含むライブラリを構築し、それをメインのバイナリにリンクしてから、JVMを作成して管理することは、同じです。 JNI API。 Google for JNI_CreateJavaVM

別の質問(Calling a Java class function from Cocoa with JNI)でJVMをスプールしてJNIを使​​用してJavaに呼び出す簡単な例を示しましたが、これはAppleバンドルのJavaVM.frameworkを使用することを前提としていたため、あなたがリンクする必要があるライブラリ。私は残念なことに、その経験はありません。

+0

答えに感謝します。 NSJavaVirtualMachineは10.6以降で廃止されましたか?私のマシン上のNSJavaVirtualMachine.hは、廃止予定のものとしてマークしています。しかし、主な問題は、Javaランタイムをアプリにバンドルしてサンドボックスにする必要があることです。同じ主な問題に直面しています.Bavariousのリンクが役立つと思います。再度、感謝します! – kayembi

+0

Bavarious 'リンクは、別々のプロセスで同じサンドボックス内で実行する別々の実行可能ファイルを埋め込むことに関するものです。私が話しているのは、JREをアプリケーションのバイナリにリンクし、Javaコードをインプロセスで実行することです(明らかにスレッドで)。サンドボックスアプリケーションにJREをリンクしてコードをインプロセスで実行すると、JREはサンドボックスプロセスで実行されるため、サンドボックス化されます。 NSJavaVirtualMachineは推奨されていません。 – ipmcc

+1

埋め込まれたJREには、純粋なJNI、つまり 'JNI_CreateJavaVM'を使用することができます。 –

1

サンドボックスと補助バイナリに関するサブ質問に答えるには、問題はありません。バイナリをサンドボックスを継承するものとしてマークするだけです。

は、このような.entitlementsファイル持っている:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>com.apple.security.app-sandbox</key> 
    <true/> 
    <key>com.apple.security.inherit</key> 
    <true/> 
</dict> 
</plist> 

をそして、あなたはAUXバイナリをcodesigns Xcodeでビルドフェーズを持っていることを確認してください。

codesign --entitlements myjava.entitlements -s "${CODE_SIGN_IDENTITY}" java 
+0

あなたの答えは、私が多くの苦労していた問題を解決するのに役立ちました。ありがとうございました! – Alexander

関連する問題