2013-01-09 5 views
6

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

एक्लिप्स कंपाइलर (जार फ़ाइलों का न्यूनतम सेट और उन्हें डाउनलोड करने के लिए) तक पहुंच प्राप्त करने का तरीका क्या है और मेमोरी में फ्लाई पर जेनरेट कोड संकलित करें?

+0

अगर यह है कि आप क्या देख रहे हैं मैं नहीं जानता की अनुमति से कॉपी किया गया है, लेकिन यह पहली हिट मैं googling "संकलक ग्रहण" से मिला था: http: // www। eclipse.org/jdt/core/index.php –

+0

यह वही है जो मैं बात कर रहा हूं लेकिन ध्यान दें कि केवल संकलक से कहीं अधिक है। – mentics

उत्तर

4

नवीनतम रिलीज पर क्लिक करके ईसीजे starting from this page पर डाउनलोड करें, फिर फ़ाइल ecj- [version] .jar ढूंढें और डाउनलोड करें। इसके लिए, मैं 4.2.1 का उपयोग कर रहा हूँ। अपने कक्षा में इस जार का संदर्भ लें।

आप org.eclipse.jdt.internal.compiler.Compiler का उपयोग करते हैं। निर्माता के लिए अधिकांश चीजें डिफ़ॉल्ट उपलब्ध हैं। आप इसे ICompilerRequestor के रूप में परिणामों के लिए कॉलबैक देते हैं। नीचे दिए गए उदाहरण परिणामों का परीक्षण करने के लिए एक सरल बाइट क्लास लोडर का उपयोग करता है। कैस्केडिंग संकलन करने के लिए, आप फ़ाइल सिस्टम का उप-वर्ग बनाते हैं, INAMEEnvironment से विधियों को ओवरराइड करते हैं।

package test.eclipse.compiler; 

import java.lang.reflect.Method; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 

import org.eclipse.jdt.internal.compiler.ClassFile; 
import org.eclipse.jdt.internal.compiler.CompilationResult; 
import org.eclipse.jdt.internal.compiler.Compiler; 
import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies; 
import org.eclipse.jdt.internal.compiler.ICompilerRequestor; 
import org.eclipse.jdt.internal.compiler.batch.CompilationUnit; 
import org.eclipse.jdt.internal.compiler.batch.FileSystem; 
import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath; 
import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; 
import org.eclipse.jdt.internal.compiler.env.INameEnvironment; 
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; 
import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; 
import org.eclipse.jdt.internal.compiler.util.Util; 


public class TestCompile { 
    static class ByteClassLoader extends ClassLoader { 
     private Map<String, byte[]> classMap; 


     public ByteClassLoader(Map<String, byte[]> classMap) { 
      super(); 
      this.classMap = classMap; 
     } 

     protected Class<?> findClass(String name) throws ClassNotFoundException { 
      byte[] bytes = classMap.get(name); 
      if (bytes == null) { 
       return super.findClass(name); 
      } else { 
       return defineClass(name, bytes, 0, bytes.length); 
      } 
     } 
    } 


    public static void compile(String code, String filename) { 
     ArrayList<Classpath> cp = new ArrayList<FileSystem.Classpath>(); 
     Util.collectRunningVMBootclasspath(cp); 
     INameEnvironment env = new NameEnv(cp.toArray(new FileSystem.Classpath[cp.size()]), null); 
     ICompilerRequestor requestor = new ICompilerRequestor() { 
      @Override 
      public void acceptResult(CompilationResult result) { 
       ClassFile[] cf = result.getClassFiles(); 
       HashMap<String, byte[]> classMap = new HashMap<String, byte[]>(); 
       classMap.put("Test", cf[0].getBytes()); 
       ByteClassLoader cl = new ByteClassLoader(classMap); 
       try { 
        Class<?> c = cl.loadClass("Test"); 
        Method m = c.getMethod("test"); 
        m.invoke(null); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     Compiler compiler = new Compiler(env, DefaultErrorHandlingPolicies.exitAfterAllProblems(), 
       new CompilerOptions(), requestor, new DefaultProblemFactory()); 

     ICompilationUnit[] units = new ICompilationUnit[] { new CompilationUnit(code.toCharArray(), filename, null) }; 
     compiler.compile(units); 
    } 

    public static void main(String[] args) { 
     compile("public class Test { public static void test() { System.out.println(\"Hello, world.\"); }}", 
       "Test.java"); 
    } 
} 

this blog post

1

ऐसा लगता है कि आप the maven repository और use it में ant के साथ जो कुछ भी ढूंढ रहे हैं उसे ढूंढ सकते हैं।

+0

धन्यवाद! क्या कहीं ऐसा है जो स्मृति में एक वर्ग को संकलित करने के लिए इसका उपयोग कैसे करता है? मैं सवाल में स्पष्ट रूप से संकेत दूंगा। – mentics

+0

मैं स्ट्रिंग को .java में समाप्त होने वाली फ़ाइल में लिखूंगा और उसे ईसीजे को भेजूंगा। – hd1

+0

नहीं। यह एक प्रदर्शन महत्वपूर्ण स्थिति है। यथासंभव तेज़ी से होने की आवश्यकता है। – mentics

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