2014-09-20 68 views
1

我有一个程序,用于更改在Eclipse中加载的输入Java项目。更改后,我使用下面的代码刷新项目并提取编译单元。Eclipse中的refreshLocal无法正常工作

IWorkspace workspace = ResourcesPlugin.getWorkspace(); 
IWorkspaceRoot root = workspace.getRoot(); 

//projectName is the name of project loaded in eclipse 
IProject project = root.getProject(projectName); 

try { 
    project.refreshLocal(IResource.DEPTH_INFINITE, null); 
} catch (CoreException e) { 
     e.printStackTrace(); 
} 

IJavaProject iJavaproject = JavaCore.create(project); 

/** Extract ICompilationUnit. "classFullName" is the name of class contains new changes.*/ 
ICompilationUnit iCompilationUnit = getICompilationUnit(javaProject, classFullName); 

/** Extract compilation unit.*/ 
CompilationUnit compilationUnit = getCompilationUnit(iCompilationUnit); 

我有这两个函数来提取iCompilationUnit和compilationUnit。

private ICompilationUnit getICompilationUnit(IJavaProject javaProject, String classFullName) { 

    ICompilationUnit iUnit = null; 
    try { 
     IType iType = javaProject.findType(classFullName); 
     iUnit = iType.getCompilationUnit(); 

     /** Create working copy. It is safer to work with a copy.*/ 
     WorkingCopyOwner owner = iUnit.getOwner(); 
     iUnit = (owner == null ? iUnit.getWorkingCopy(null) : iUnit.getWorkingCopy(owner, null)); 
    } catch (JavaModelException e) { 
     e.printStackTrace(); 
    } 

    return iUnit; 
} 

CompilationUnit getCompilationUnit(ICompilationUnit iCompilationUnit) { 

    @SuppressWarnings("deprecation") 
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT); 
    parser.setSource(iCompilationUnit); 

    /** we need bindings later on.*/ 
    parser.setResolveBindings(true); 
    return (CompilationUnit) parser.createAST(null); 
} 

不过,我所面临的问题是,这种方法首先调用(第一次,任何更改应用于该项目),上面的代码无法检测的更改并返回原来的版本。但是,在此之后,项目正确刷新,最终compilationUnit包含应用的更改。

我不确定问题是否为refreshLocal,也可能是其他两个函数:getCompilationUnit和getICompilationUnit。

请让我知道,如果任何人有任何想法。

回答

1

我认为JDT可能正在运行后台作业来重新编译和重建索引。所以你需要等待这些工作完成。尝试

IJobManager jobManager = Job.getJobManager(); 

jobManager.join(ResourcesPlugin.FAMILY_MANUAL_BUILD, monitor); 

jobManager.join(ResourcesPlugin.FAMILY_AUTO_BUILD, monitor); 

refreshLocal之后做到这一点,但你做任何事情之前。

+0

在refreshLocal之后,暂停必须是**,它是触发JDT启动构建的refreshLocal期间生成的事件。同样,'join'调用必须位于'refreshLocal'之后。 – 2014-09-20 19:23:14

+0

关于这一点的思考更多我不认为一个调度规则可以用来正确地延迟工作,所以必须使用'join'方法。 – 2014-09-20 20:01:25

+0

我接受答案。 JDT正在运行后台作业时发生问题。在refreshLocal之后添加此指令解决了问题。 ** jobManager.join(ResourcesPlugin.FAMILY_AUTO_BUILD,null); ** – user3601784 2014-09-21 12:03:39