2014-02-21 28 views
0

我正在研究一個需要根據指定的語言(語言將只有函數定義)生成Java類的項目。 JvmModelInferrer/IGenerater需要隱式調用java項目。調用JvmModelInferrer/Generator從Java項目生成代碼時的NullPointerException

按照How to invoke Xtext parser/JvmModelInferrer from a Java project的帖子給出的步驟,但不幸的是EclipseResourceFileSystemAccess2.generateFile()正在投擲NullPointerException

用於生成代碼:

public class Generator { 
    private static IGenerator generator; 

    public static void main(String[] args) { 

     // this line registers the EMF for our DSL 
     Injector injector = new RequestDslStandaloneSetup().createInjectorAndDoEMFRegistration(); 
     ResourceSet rs = new ResourceSetImpl(); 
     File file = new File(
       "D:/Xtext/XtextFormIntegration/runtime-XtextFormNC/XtextFormCar/lang.request"); 
     Resource resource = rs.getResource(URI.createURI(file.toURI().toString()), true); 

     //setup the generator 
     generator = injector.getInstance(IGenerator.class); 

     //setup the file system access 
     final EclipseResourceFileSystemAccess2 fsa = new EclipseResourceFileSystemAccess2(); 


     generator.doGenerate(resource, fsa); 

     } 
    } 

唯一的例外是:

Exception in thread "main" java.lang.NullPointerException 
    at org.eclipse.xtext.builder.EclipseResourceFileSystemAccess2.generateFile(EclipseResourceFileSystemAccess2.java:156) 
    at org.eclipse.xtext.generator.AbstractFileSystemAccess.generateFile(AbstractFileSystemAccess.java:75) 
    at org.eclipse.xtext.xbase.compiler.JvmModelGenerator._internalDoGenerate(JvmModelGenerator.java:201) 
    at org.eclipse.xtext.xbase.compiler.JvmModelGenerator.internalDoGenerate(JvmModelGenerator.java:1756) 
    at org.eclipse.xtext.xbase.compiler.JvmModelGenerator.doGenerate(JvmModelGenerator.java:181) 
    at de.itemis.utils.jface.viewers.Generator.main(Generator.java:41) 

需要你在解決上述問題的幫助。

感謝您的期待。

+0

哪一行是156? – csmckelvey

+0

URI是一個類嗎? – panoptical

+0

是的,包是org.eclipse.emf.common.util.URI – PriyaSabut

回答

1

EclipseResourceFileSystemAccess2只能在完全初始化的Eclipse環境(包括工作區等)中使用。如果你想編寫一個獨立的應用程序(一個普通的main方法的類),你應該從注入器中獲得一個IFileSystemAccess的實例,類似於你在生成器中做的那樣。

+0

謝謝你的回答。我使它與JavaIoFileSystemAccess一起工作 – PriyaSabut

1

下面的代碼使用JavaIoFileSystemAccess和IEncodingProvider。

public class Generator { 

    private static IGenerator generator; 

    public static void main(String[] args) { 

     // this line registers the EMF for our DSL 
     Injector injector = new MyDslStandaloneSetup().createInjectorAndDoEMFRegistration(); 
     ResourceSet rs = new ResourceSetImpl(); 
     File file = new File(
       "D:/Xtext/asap.dsl"); 
     Resource resource = rs.getResource(URI.createURI(file.toURI().toString()), true); 

     //setup the generator 
     generator = injector.getInstance(IGenerator.class); 

     //setup the file system access 
     final JavaIoFileSystemAccess jfsa = new JavaIoFileSystemAccess(); 
     jfsa.setOutputPath("Test"); 
     Guice.createInjector(new AbstractGenericModule() { 

      public Class<? extends IEncodingProvider> bindIEncodingProvider() { 
       return IEncodingProvider.Runtime.class; 
      } 

     }).injectMembers(jfsa); 

     generator.doGenerate(resource, jfsa);  
} 

}

感謝。