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
如何避免;org.eclipse.jdt.core.JavaModelException:更新冲突;_Java_Eclipse_Eclipse Jdt - Fatal编程技术网

如何避免;org.eclipse.jdt.core.JavaModelException:更新冲突;

如何避免;org.eclipse.jdt.core.JavaModelException:更新冲突;,java,eclipse,eclipse-jdt,Java,Eclipse,Eclipse Jdt,我编写了一个插件,它对遗留代码进行了一些批量更改。这些更改是在一组ICompilationUnits的循环中完成的,这些单元逐个进行处理。运行多次后,可能会再次更改相同的编译单元 如果是第一次运行,该命令工作正常。之后,当我再次运行该命令时,会得到一个JavaModelException org.eclipse.jdt.core.JavaModelException:更新冲突 在org.eclipse.jdt.internal.core.JavaModelOperation.runOperati

我编写了一个插件,它对遗留代码进行了一些批量更改。这些更改是在一组
ICompilationUnits
的循环中完成的,这些单元逐个进行处理。运行多次后,可能会再次更改相同的编译单元

如果是第一次运行,该命令工作正常。之后,当我再次运行该命令时,会得到一个
JavaModelException

org.eclipse.jdt.core.JavaModelException:更新冲突
在org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:784)~[na:na]
在org.eclipse.jdt.internal.core.CompilationUnit.commitworkcopy(CompilationUnit.java:391)~[na:na]
...
如何避免此异常?我处理代码更改的代码如下所示:

public void process(ICompilationUnit cu, SubMonitor monitor) throws CoreException {
    monitor.setWorkRemaining(7);
    try {
        cu.becomeWorkingCopy(monitor.newChild(1));

        CompilationUnit unit = EclipseUtil.parseAst(cu, monitor.newChild(1));
        ASTRewrite rewrite = ASTRewrite.create(unit.getAST());
        ImportRewrite importRewrite = ImportRewrite.create(unit, true);

        // Do the Work
        processSearchResults(unit, rewrite, importRewrite, monitor.newChild(1));

        cu.applyTextEdit(rewrite.rewriteAST(), monitor.newChild());
        TextEdit importEdit = importRewrite.rewriteImports(monitor.newChild(1));
        cu.applyTextEdit(importEdit, monitor.newChild(1));

        if (monitor.isCanceled())
            cu.discardWorkingCopy();
        else
            cu.commitWorkingCopy(false, monitor.newChild(1));
    } catch (Exception e) {
        cu.discardWorkingCopy();
        throw e;
    } finally {
        monitor.done();
    }
}

所有实例都是新读取的。插件本身不缓存任何内容。是否有我忘记做的事情,比如刷新或关闭资源?可能是装置AST本身?

错误是在
CommitWorkingCopyOperation中生成的。请验证

if (cu.hasResourceChanged() && !this.force) {
  return new JavaModelStatus(IJavaModelStatusConstants.UPDATE_CONFLICT);
}

hasResourceChanged
正在对照源文件的时间戳检查编译单元中存储的时间戳。因此,看起来您正在选择一个过时的编译单元。

嗨,格雷格,谢谢您的输入。如何确保编译单元得到“刷新”?我看到了ICompilationUnit.Reconfice(…),但这似乎是另外一回事。