2013-06-06 2 views
9

क्या कोई मैक कोको (सैंडबॉक्स) ऐप में जावा रनटाइम को एम्बेड करने का तरीका जानता है ताकि ऐप जावा को अलग से इंस्टॉल करने के बिना .jar फ़ाइल चला सके?एक सैंडबॉक्स वाले कोको मैक ऐप में जावा रनटाइम एम्बेड करना

हमारे पास एक कोको एप्लिकेशन है जिसे हम मैक ऐप स्टोर के साथ-साथ अपनी साइट पर भी बेचते हैं जो एक विशिष्ट कार्य के लिए जावा का उपयोग कर सकते हैं। यह एक लेखन ऐप है, और क्योंकि .doc, .docx और .odt के लिए मानक NSText निर्यातक बहुत सीमित हैं (शीर्षलेख, पाद लेख, छवियों आदि का समर्थन नहीं करते), हम आरटीएफ को लिखते हैं और फिर जावा-आधारित कनवर्टर्स का उपयोग करते हैं (Aspose से। कॉम) चयनित निर्यात प्रारूप के आधार पर आरटीएफ को .doc, .docx या .odt में परिवर्तित करने के लिए।

मैं एनएसटीस्क का उपयोग करके/usr/bin/java पर कॉल करने के लिए ऐसा करता हूं और एक बंडल .jar फ़ाइल चलाता हूं जो रूपांतरण दिनचर्या चलाता है। यह सब खूबसूरती से काम करता है - जब तक उपयोगकर्ता के मैक पर जावा स्थापित किया जाता है। यदि यह इंस्टॉल नहीं है, तो हमारा ऐप उपयोगकर्ता से पूछता है कि क्या वह बढ़ाए गए कन्वर्टर्स से लाभ उठाने के लिए जावा इंस्टॉल करना चाहते हैं, या इसके बजाय एनएसटीएक्स्ट हानिकारक कनवर्टर्स पर वापस आना चाहते हैं। यदि उपयोगकर्ता जावा स्थापित करना चुनता है, तो हम ओएस एक्स के जावा इंस्टॉलर को आमंत्रित करने के लिए java_home --request को कॉल करते हैं।

हालांकि, अब ऐप्पल जावा के लिए सीधा समर्थन समाप्त कर चुका है (या समाप्त हो रहा है), यह दृष्टिकोण समस्याग्रस्त है। हमारी आखिरी मैक ऐप स्टोर समीक्षा के दौरान, हमें बताया गया था कि अगर हमें जावा इंस्टॉल करना है तो हमें जल्द ही उपयोगकर्ता से पूछना बंद करना होगा। मैंने पढ़ा है कि एप्पल के अनुशंसित मार्ग आगे बढ़ रहे हैं जावा रनटाइम पर्यावरण को कोको अनुप्रयोगों में एम्बेड करना है जिन्हें जावा चलाने की आवश्यकता है। (उदाहरण के लिए: http://lists.apple.com/archives/java-dev/2011/Jul/msg00038.html)

पिछले कुछ दिनों से अधिक

, इसलिए मैं शोध किया गया है कि कैसे मैं अपने अनुप्रयोग में एक JRE एम्बेड करने के बारे में जा सकते हैं, लेकिन मैं कैसे इतना कहीं भी करने के लिए पर कोई निर्देश नहीं मिला है - कुछ भी नहीं है कि मैं कम से कम समझता हूं। किसी ने एक ऐसे ही सवाल यहाँ साल पहले के एक जोड़े से पूछा:

Bundling a private JRE on Mac OS X

हालांकि, वहाँ जवाब, और अन्य साइटों पर मैंने पाया, सब के बारे में एक मैक आवेदन के रूप में एक जावा अनुप्रयोग बांध दिया, के बारे में नहीं कर रहे हैं एक मौजूदा कोको आवेदन के साथ एक जेआरई सहित। (हालांकि मैं स्वीकार करता हूं कि जावा के साथ अनुभव की कमी का मतलब यह हो सकता है कि मुझे समझ में नहीं आता कि मेरे उद्देश्यों के लिए निर्देशों को कैसे परिवर्तित किया जाए - मुझे एक्सकोड से बाहर ले जाएं और मैं अपने आराम क्षेत्र से बाहर हूं।) इसी तरह: https://wikis.oracle.com/display/OpenJDK/How+to+embed+a+.jre+bundle+in+your+Mac+app

ऐसा लगता है कि कुछ अनुप्रयोगों ने यह किया है (उदाहरण के लिए साइबरडक), लेकिन किसी ने अभी तक प्रक्रिया को दस्तावेज नहीं किया है। मैंने जो पढ़ा है, उससे मैं सोचता हूं मुझे या तो ओरेकल के जेडीके या ओपनजेडीके से जावा वर्चुअल मशीन को पकड़ने की आवश्यकता है और इसमें शामिल है कि मेरे कोको ऐप में और जावा से उस पर कॉल करें, लेकिन अगर मैंने ऐसा किया, तो जावा एक्जिक्यूटिव जेवीएम की प्रतिलिपि सैंडबॉक्स नहीं की जाएगी, इसलिए मेरा ऐप एमएएस समीक्षा प्रक्रिया के माध्यम से नहीं मिलेगा। तो शायद मुझे किसी भी तरह से जेडीके और सैंडबॉक्स की प्रतिलिपि बनाने की ज़रूरत है, संभवतः मेरे बड़े एक्सकोड प्रोजेक्ट के हिस्से के रूप में? मुझे यह भी यकीन नहीं है कि कहां से शुरू करना है; मैं अनुमान लगा रहा हूं कि यह अभी भी शुरुआती दिनों में है और कई मैक डेवलपर्स को अभी तक ऐसा करना नहीं है।

क्या किसी को कोको एप्लिकेशन में जेआरई एम्बेड करने का कोई अनुभव है, इस तरह से ऐप एनएसटीस्क का उपयोग करके इसे कॉल कर सकता है? और इस तरह से जेआरई पूरी तरह से सैंडबॉक्स किया गया है और इस प्रकार मैक ऐप स्टोर द्वारा स्वीकार्य है? या, क्या किसी ने सफलतापूर्वक एक सैंडबॉक्स वाले कोको ऐप बनाया है जो एक अलग जावा इंस्टॉलेशन की आवश्यकता के बिना .jar फ़ाइल चलाता है? यदि हां, तो क्या आप यह साझा करने के इच्छुक होंगे कि आपने यह कैसे किया?

(मैं एप्पल इस पर मदद के लिए पूछ के साथ एक डेवलपर तकनीकी सहायता घटना बाहर ले, लेकिन बताया गया था कि वे मदद नहीं कर सब पर यह देखते हुए कि जावा अब एक तीसरे पक्ष के विकास के वातावरण माना जाता है।)

वेब पृष्ठों पर किसी भी सुझाव या पॉइंटर्स के लिए अग्रिम धन्यवाद, मुझे याद आ सकता है।

+1

यह चाहते _looks_ तुम्हारा का एक विशिष्ट मामला है अधिक सामान्य 'सैंडबॉक्स' समस्या के भीतर एक सहायक निष्पादन योग्य का उपयोग कैसे करें। क्या यह जेआरई के लिए एंटाइटेलमेंट निर्दिष्ट करने और http://www.codeotaku.com/journal/2012-10/code-igning-auxiliary-executables/index में वर्णित कोड-हस्ताक्षर करने का विषय नहीं होगा? –

+0

बहुत धन्यवाद! मुझे लगता है कि लिंक सिर्फ वही है जो मुझे चाहिए था। (और यह एक समस्या को संबोधित करता है जिसे मैं किसी अन्य निष्पादन योग्य के साथ भी सामना कर रहा था।) तो, मेरा दृष्टिकोण है: ओरेकल की साइट से जेआरई को मेरे ऐप के साथ बंडल करें; 10.6 और उससे नीचे, जावा के ओएस एक्स के अंतर्निर्मित संस्करण पर कॉल करें (यह देखते हुए कि यह डिफ़ॉल्ट रूप से 10.6- पर स्थापित किया गया था, और ओरेकल के जेआरई 7 केवल 10.7+ पर काम करता है); 10.7+ पर, ऐप में बनाए गए जेआरई पर कॉल करें, और कोडोटाकू लिंक में विधि का उपयोग कर जावा एक्जिक्यूटिव सैंडबॉक्स को कॉल करें। फिंगर्स ने इसे पारित किया है। एक बार फिर धन्यवाद! – kayembi

उत्तर

1

मुझे यकीन नहीं है, लेकिन मुझे दृढ़ता से संदेह है कि जब ऐप्पल इंजीनियर कहते हैं कि वे जावा रनटाइम को "एम्बेडिंग" का सुझाव देते हैं, तो इसका मतलब यह नहीं है कि "अपने ऐप बंडल में एक अलग निष्पादन योग्य बंडल करें और इसे अलग से चलाएं प्रक्रिया "जितना अधिक उसका मतलब है" अपनी स्वयं की प्रक्रिया में जावा वीएम को स्पिन करें और उस वीएम में आपको जो चाहिए उसे चलाएं। " जावा को एक अलग प्रक्रिया में चलाने के लिए यह तर्कसंगत रूप से अधिक बोझिल है, लेकिन यह संभव है।

NSJavaVirtualMachine कक्षा पर एक नज़र डालें। यह उपयोगकर्ता की सहायता नहीं कर सकता है यदि उपयोगकर्ता के पास जावा स्थापित नहीं है, लेकिन विचार समान होगा - आप केवल जावा रनटाइम वाली लाइब्रेरी बनायेंगे, इसे अपने मुख्य बाइनरी में लिंक करें, फिर JVM का उपयोग करके प्रबंधित करें और प्रबंधित करें जेएनआई एपीआई। JNI_CreateJavaVM के लिए Google।

मैंने जेएमआई को एक अन्य प्रश्न (Calling a Java class function from Cocoa with JNI) में जेएनआई का उपयोग करके जावा में कॉल करने और जावा में कॉल करने का एक त्वरित उदाहरण दिया, हालांकि यह ऐप्पल-बंडल JavaVM.framework का उपयोग करने पर आधारित था, इसलिए इसमें इमारत पर कदम शामिल नहीं हैं पुस्तकालय आपको लिंक करने की आवश्यकता होगी। दुर्भाग्यवश, मेरे पास इसका कोई अनुभव नहीं है।

+0

उत्तर के लिए बहुत धन्यवाद। NSJavaVirtualMachine 10.6+ पर बहिष्कृत नहीं है, हालांकि? निश्चित रूप से मेरी मशीन पर NSJavaVirtualMachine.h सब कुछ को बहिष्कृत के रूप में चिह्नित करता है। हालांकि, मुख्य समस्या यह है कि मुझे अभी भी अपने ऐप और सैंडबॉक्स में जावा रनटाइम को बंडल करना होगा, इसलिए मुझे अभी भी एक ही मुख्य मुद्दे का सामना करना पड़ेगा - सौभाग्य से मुझे लगता है * Bavarious के लिंक को इसके साथ मदद करनी चाहिए। एक बार फिर धन्यवाद! – kayembi

+0

Bavarious 'लिंक अलग निष्पादन योग्यों को एम्बेड करने के बारे में है जो आप अलग प्रक्रियाओं में चलते हैं लेकिन उसी सैंडबॉक्स में। मैं जो बात कर रहा हूं वह आपके आवेदन की बाइनरी में जेआरई को जोड़ रहा है और जावा कोड इन-प्रोसेस (जाहिर है अपने धागे पर) चला रहा है। यदि आप अपने जेडईई को अपने सैंडबॉक्स किए गए एप्लिकेशन में लिंक करते हैं और कोड को प्रक्रिया में निष्पादित करते हैं, तो जेआरई सैंडबॉक्स प्रक्रिया में चलने के आधार पर सैंडबॉक्स किया जाता है। और आप सही हैं NSJavaVirtualMachine बहिष्कृत है। – ipmcc

+1

आप अभी भी शुद्ध जेएनआई का उपयोग कर सकते हैं, यानी 'जेएनआई_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> 

और सुनिश्चित करें कि आप Xcode में निर्माण चरण है कि aux द्विआधारी codesigns बनाती हैं:

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

आपके उत्तर ने मुझे उस समस्या को हल करने में मदद की जो मैं बहुत संघर्ष कर रहा था। धन्यवाद! – Alexander

संबंधित मुद्दे