में जावाकंपेलर का उपयोग करना मैं ओएसजीआई का उपयोग करने के लिए जावा एप्लिकेशन को पुन: सक्रिय करने की प्रक्रिया में हूं। एप्लिकेशन की एक विशेषता 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 अब जरूरत रास्तों में शामिल है। एप्लिकेशन के रिफैक्टर ओएसजीआई संस्करण में, कंपाइलर को उपरोक्त कोड के साथ-साथ अन्य बंडलों के वर्गों के समान बंडल के भीतर कक्षाओं तक पहुंच की आवश्यकता होती है। मैं इन वर्गों के बारे में संकलक कैसे जागरूक बना सकता हूं?
मैं दो संभव समाधान के बारे में सोचा गया है:
- संकलक ऊपर कोड युक्त के बाद से यह सभी आवश्यक वर्गों के बारे में पता है बंडल द्वारा प्रयोग किया जाता classloader दे। हालांकि, यह here और here पढ़ने से एक व्यावहारिक समाधान की तरह प्रतीत नहीं होता है।
- स्थापित बंडलों के भौतिक स्थानों का उपयोग करके कक्षापथ बनाएं। मैंने
org.osgi.framework.Bundle.getLocation()
पर देखा है लेकिन मुझे यकीन नहीं है कि यह एक विश्वसनीय समाधान होगा या नहीं। जिन मार्गों को मैं वापस प्राप्त करता हूं (कम से कम जब ग्रहण के भीतर तैनाती) रिश्तेदार हैं और मुझे यकीन नहीं है कि वे सभी प्लेटफॉर्म और परिस्थितियों में उपयोग करने के लिए सुरक्षित होंगे या नहीं।
क्या विकल्प दो ऊपर संभव प्रतीत होता है? क्या कोई बेहतर समाधान है?
एक और नोट: मैंने एक दृष्टिकोण देखा है [यहां] (http://blog.linkedin.com/2008/06/12/osgi-at-linkedin-java-compilation-in-osgi/) जो प्रकट होता है काम करने के लिए, लेकिन यह आंतरिक जेडीटी कक्षाओं पर निर्भर करता है। मैंने जो पढ़ा है, उससे यह अच्छा अभ्यास नहीं है। –
किसी के पास कोई विचार है ...? –