2012-02-02 16 views
5

हाय मुझे जावा क्लास रन टाइम बनाने, संकलित करने और लोड करने की आवश्यकता है। एफटीएल का उपयोग करके मैं जावा स्रोत फाइलें बना रहा हूं, और यदि गतिशील निर्भरता नहीं है तो स्रोत को संकलित करने में सक्षम है।एकाधिक जावा फाइलों को संकलित करने के लिए जावा कंपाइलर एपीआई का उपयोग

एक उदाहरण के साथ विस्तार करने के लिए, मेरे पास दो जावा स्रोत फ़ाइल, एक इंटरफेस और इसकी कार्यान्वयन कक्षा है। मैं के रूप में

String classpath=System.getProperty("java.class.path"); 
     String testpath =classpath+";"+rootPath+"/lib/is_wls_client.jar;"+rootPath+"/rtds_wls_proxyclient.jar;.;"; 
     File javaFile = new File(javaFileName+".java"); 
     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
     List<String> optionList = new ArrayList<String>(); 
     optionList.addAll(Arrays.asList("-classpath",testpath)); 
     StandardJavaFileManager sjfm = compiler.getStandardFileManager(null, null, null); 
     Iterable fileObjects = sjfm.getJavaFileObjects(javaFile); 
     JavaCompiler.CompilationTask task = compiler.getTask(null, null, null,optionList,null,fileObjects); 
     task.call(); 
     sjfm.close(); 

इस प्रकार जावा संकलक एपीआई का उपयोग कर रहा स्थिर वर्ग है जो classpath में पहले से ही कर रहे हैं के लिए वर्ग पथ सेट इंटरफेस को संकलित करने में सक्षम हूँ, लेकिन इस दृष्टिकोण डायनामिक रूप से तैयार वर्गों के लिए काम नहीं करते? कोई भी कस्टम क्लास लोडर ठीक करेगा? मेरे अंतिम कार्यान्वयन वेब/एप्लिकेशन सर्वर

में होगा किसी भी प्रतिक्रिया की सराहना की अत्यधिक जाएगा

सतीश

उत्तर

6

मैं सभी जावा संकलन के द्वारा इस समस्या को हल करने में सक्षम था फाइलें एक साथ। FTL का उपयोग करते हुए मैं जावा वर्गों जेनरेट करना और फिर कस्टम वर्ग लोडर के साथ जावा संकलक एपीआई और लोड वर्गों का उपयोग यह संकलन

जावा संकलक

private void compile(File[] files) throws IOException{ 
     String classpath=System.getProperty("java.class.path"); 
     String rootPath=getServletContext().getRealPath("/"); 
     System.out.println("--> root Path "+rootPath); 
     String testpath=classpath+";.;xx.jar;yy.jar"; 
     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
     List<String> optionList = new ArrayList<String>(); 
     optionList.addAll(Arrays.asList("-classpath",testpath)); 
//  optionList.addAll(Arrays.asList("-d",rootPath+"/target")); 
     StandardJavaFileManager sjfm = compiler.getStandardFileManager(null, null, null); 
     Iterable fileObjects = sjfm.getJavaFileObjects(files); 
     JavaCompiler.CompilationTask task = compiler.getTask(null, null, null,optionList,null,fileObjects); 
     task.call(); 
     sjfm.close(); 

    } 

कोड स्निपेट नीचे दिखाता है कि कस्टम वर्ग लोडर उपयोग करने के लिए

class CustomClassLoader extends ClassLoader { 

    public CustomClassLoader(ClassLoader parent) { 
      super(parent); 
    } 

    public Class findClass(String className,String path) { 
     byte[] classData = null; 
     try { 
      FileInputStream f = new FileInputStream(path); 
      int num = f.available(); 
      classData = new byte[num]; 

      f.read(classData); 
     } catch (IOException e) { 
      System.out.println(e); 
     } 
     Class x = defineClass(className, classData, 0, classData.length); 
     return x; 
    } 
} 

धन्यवाद सतीश

+0

कक्षा को परिभाषित करने के बाद, आपको इसे हल करने की आवश्यकता है। –

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