Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Eclipse中的refreshLocal无法正常工作_Java_Eclipse_Plugins - Fatal编程技术网

Java Eclipse中的refreshLocal无法正常工作

Java Eclipse中的refreshLocal无法正常工作,java,eclipse,plugins,Java,Eclipse,Plugins,我有一个程序可以更改Eclipse中加载的输入Java项目。更改后,我使用下面的代码刷新项目并提取编译单元 IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceRoot root = workspace.getRoot(); //projectName is the name of project loaded in eclipse IProject project = root.getProject(proje

我有一个程序可以更改Eclipse中加载的输入Java项目。更改后,我使用下面的代码刷新项目并提取编译单元

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);
}
然而,我面临的问题是,第一次调用此方法(第一次将任何更改应用于项目时),上述代码无法检测更改并返回原始版本。但是,在此之后,项目将正确刷新,最终编译单元将包含应用的更改

我不确定问题是否出在refreshLocal上,也可能出在其他两个函数上:GetCompliationUnit和getICompilationUnit


如果有人有任何想法,请告诉我。

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

IJobManager jobManager = Job.getJobManager();

jobManager.join(ResourcesPlugin.FAMILY_MANUAL_BUILD, monitor);

jobManager.join(ResourcesPlugin.FAMILY_AUTO_BUILD, monitor);

在执行
refreshLocal
之后执行此操作,但在执行其他操作之前。

暂停必须在refreshLocal之后进行,是refreshLocal期间生成的事件触发JDT启动构建。类似地,
join
调用必须在
refreshLocal
之后。再仔细考虑一下,我认为不能使用调度规则来正确延迟作业,因此必须使用
join
方法。我接受答案。问题发生在JDT运行后台作业时。在刷新本地后添加此指令解决了问题。jobManager.join(ResourcesPlugin.FAMILY\u AUTO\u BUILD,null);我还发现添加了jobManager.wakeUp(ResourcesPlugin.FAMILY\u AUTO\u BUILD);加入前可以提高速度(至少在我的程序中)。