2013-04-30 76 views
0

我目前正在開發編程導師。這些導師是獨立的Java應用程序。我使用Eclipse JDT來解析Java源代碼並構建相應的抽象語法樹。此外,我想捕獲如果學生在Eclipse中編譯他的代碼時將會啓動的錯誤消息。 Eclipse使我們能夠解析和跟蹤特定字符串代碼的錯誤消息(無需上下文)。在編譯完字符串之後,我收到了9條錯誤消息。當我在Eclipse項目中粘貼該代碼時,我收到了大約90條錯誤消息。顯然,目的是儘可能多地跟蹤錯誤。我懷疑這取決於源代碼的上下文。跟蹤Eclipse JDT編譯器錯誤消息(IProblem)

爲此,我嘗試以編程方式創建工作區內的項目並創建包含源代碼字符串的文件。但是,執行我的Java應用程序時,出現以下錯誤消息:

Exception in thread "main" java.lang.IllegalStateException: Workspace is closed. 
    at org.eclipse.core.resources.ResourcesPlugin.getWorkspace(ResourcesPlugin.java:399) 
    at com.example.helloworld.JavaErr.main(JavaErr.java:67) 

我閱讀了許多關於此主題的文章。我們似乎只能在Eclipse插件項目中訪問工作區內的資源。在放棄這個「解決方案」路徑之前,是否有可能知道我們是否可以在外部獨立Java應用程序中以編程方式訪問工作區及其所有資源?

回答

0

我最終需要解決char []源代碼與其環境(setEnvironment)之間的綁定,並設置編譯單元的名稱。通過設置環境,我們可以繞過工作區並通過導入適當的庫(類路徑)和源代碼(源路徑)來創建自己的「虛擬」項目。

如果有人想要檢索語法錯誤,他只需啓用語句的恢復。因此,我們能夠在獨立Java應用程序中解析外部Java文件,並檢索與實際Eclipse項目中相同數量的錯誤(包聲明錯誤除外)。

下面是代碼片段我使用:

 File file = new File(""); 
     String srcCode = Files.toString(file, Charsets.UTF_8); 
     ASTParser parser = ASTParser.newParser(AST.JLS3); 
     parser.setSource(srcCode.toCharArray()); 
     parser.setKind(ASTParser.K_COMPILATION_UNIT); 
     Map options = JavaCore.getOptions(); 
     JavaCore.setComplianceOptions(JavaCore.VERSION_1_5, options); 
     parser.setCompilerOptions(options); 

     String[] classpath = {"", "", ""}; 
     String[] sourcepath = {""}; 

     parser.setEnvironment(classpath, sourcepath, null, true); 
     parser.setUnitName(""); 
     parser.setResolveBindings(true); 
     parser.setBindingsRecovery(true); 
     parser.setStatementsRecovery(true); 
     CompilationUnit cu = (CompilationUnit) parser.createAST(null); 
     cu.accept(new ASTVisitor2(cu));