Java Eclipse中的refreshLocal无法正常工作
我有一个程序可以更改Eclipse中加载的输入Java项目。更改后,我使用下面的代码刷新项目并提取编译单元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
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);加入前可以提高速度(至少在我的程序中)。