2011-06-23 15 views
6

में जावाकंपेलर का उपयोग करना मैं ओएसजीआई का उपयोग करने के लिए जावा एप्लिकेशन को पुन: सक्रिय करने की प्रक्रिया में हूं। एप्लिकेशन की एक विशेषता javax.tools.JavaCompiler का उपयोग कर ऑन-द-फ्लाई जावा संकलन है। मूल आवेदन में इस प्रक्रिया ने मौजूदा क्लासपाथ को कंपाइलर को खिलाकर काम किया।ओएसजीआई बंडल

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
String[] options = {"-classpath", System.getProperty("java.class.path")}; 
DiagnosticListener<JavaFileObject> listener = new DiagnosticListener<JavaFileObject>() {...}; 
StandardJavaFileManager fileManager = compiler.getStandardFileManager(listener, null, null); 
Iterable<? extends JavaFileObject> fileObjects = fileManager.getFileObjects(sourceFile); 
CompilationTask task = compiler.getTask(null, fileManager, listener, Arrays.asList(options), null, fileObjects); 
task.call(); 

बहरहाल, यह एक OSGi बंडल में काम नहीं करेगा क्योंकि classpath अब जरूरत रास्तों में शामिल है। एप्लिकेशन के रिफैक्टर ओएसजीआई संस्करण में, कंपाइलर को उपरोक्त कोड के साथ-साथ अन्य बंडलों के वर्गों के समान बंडल के भीतर कक्षाओं तक पहुंच की आवश्यकता होती है। मैं इन वर्गों के बारे में संकलक कैसे जागरूक बना सकता हूं?

मैं दो संभव समाधान के बारे में सोचा गया है:

  1. संकलक ऊपर कोड युक्त के बाद से यह सभी आवश्यक वर्गों के बारे में पता है बंडल द्वारा प्रयोग किया जाता classloader दे। हालांकि, यह here और here पढ़ने से एक व्यावहारिक समाधान की तरह प्रतीत नहीं होता है।
  2. स्थापित बंडलों के भौतिक स्थानों का उपयोग करके कक्षापथ बनाएं। मैंने org.osgi.framework.Bundle.getLocation() पर देखा है लेकिन मुझे यकीन नहीं है कि यह एक विश्वसनीय समाधान होगा या नहीं। जिन मार्गों को मैं वापस प्राप्त करता हूं (कम से कम जब ग्रहण के भीतर तैनाती) रिश्तेदार हैं और मुझे यकीन नहीं है कि वे सभी प्लेटफॉर्म और परिस्थितियों में उपयोग करने के लिए सुरक्षित होंगे या नहीं।

क्या विकल्प दो ऊपर संभव प्रतीत होता है? क्या कोई बेहतर समाधान है?

+0

एक और नोट: मैंने एक दृष्टिकोण देखा है [यहां] (http://blog.linkedin.com/2008/06/12/osgi-at-linkedin-java-compilation-in-osgi/) जो प्रकट होता है काम करने के लिए, लेकिन यह आंतरिक जेडीटी कक्षाओं पर निर्भर करता है। मैंने जो पढ़ा है, उससे यह अच्छा अभ्यास नहीं है। –

+0

किसी के पास कोई विचार है ...? –

उत्तर

3

मैंने GitHub पर एक कामकाजी उदाहरण बनाया है।

यह विकल्प 1 या 2 नहीं है, यह एक कस्टम JavaFileManager बनाता है जो सभी बंडलों को देखता है और उनके संसाधनों को पुनर्प्राप्त करता है। ध्यान में रखना करने के लिए

चीजें:

  • यह JSR 199 संकलक API का उपयोग करता है, लेकिन यह OpenJDK/सूर्य संकलक पर ही काम करता है, ग्रहण जेडीटी संकलक इस संबंध में टूट लगता है।
  • मैंने केवल इक्विनोक्स पर परीक्षण किया है, मैंने किसी भी विषुव विशिष्ट कोड का उपयोग नहीं किया है, इसलिए इसे अन्य कार्यान्वयन पर काम करना चाहिए।
  • यह अनुकूलित नहीं है, इसलिए यह धीमा और/या स्मृति भूखा हो सकता है।
  • यह रजिस्टर एक बंडल श्रोता तो यह अपने वर्ग कैश फ्लश जब एक बंडल जो एक निश्चित पैकेज प्रदान करता है निराकरण या unresolves
  • यह विभाजन संकुल के लिए बहुत निर्धारित करने योग्य नहीं है करता है, मुझे लगता है।
  • यह BundleWiring एपीआई, जो OSGi 4.3 में पेश किया गया था का उपयोग करता है, तो यह OSGi (उदाहरण के लिए Karaf 2.x)

मैं Technology Excruciation उल्लेख करना चाहिए के पुराने OSGi कार्यान्वयन पर काम नहीं करेगा, उसके उदाहरण की मदद की मुझे जबरदस्त साथ।

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