4

我创建了一个插件来挂钩保存操作并创建一个已编辑 javascript 文件的缩小 javascript 文件。你可以在这个问题中看到完整的代码:eclipse plugin does not work after update to juno (eclipse 4)

问题是,自从 Juno 以来,这个插件在工作空间构建过程中创建了无限循环。它首先开始缩小我根本没有更改的文件。该文件在构建中创建了一个无限循环。当它完成缩小文件时,它会启动一个新的工作区构建并再次缩小文件,依此类推。但一段时间后情况会变得更糟,尤其是在新的日食开始时。突然间,它缩小了十几个我从未接触过的文件。如果我卸载我的插件,然后让 eclipse 构建工作区,重新安装我的插件它再次工作。但过了一会儿,这一切又开始了。

我认为这与我处理创建文件的工作方式有关,见下文。也许朱诺在这里发生了一些变化?但我找不到任何有关此的信息。

Job compileJob = new Job("Compile .min.js") {
 public IStatus run(IProgressMonitor monitor) {
        public IStatus run(IProgressMonitor monitor) {
            byte[] bytes = null;
            try {
                bytes = CallCompiler.compile(fullLocation.toString(), CallCompiler.SIMPLE_OPTIMIZATION).getBytes();

                InputStream source = new ByteArrayInputStream(bytes);
                if (!newFile.exists()) {
                    newFile.create(source, IResource.NONE, null);
                } else {
                    newFile.setContents(source, IResource.NONE, null);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (CoreException e) {
                e.printStackTrace();
            }
            return Status.OK_STATUS;
        }
};
compileJob.setRule(newFile.getProject());
compileJob.schedule();
4

1 回答 1

2

您需要设置newFile为派生。派生文件是在构建期间由工作区隐式创建的文件,应该在清理期间将其擦除(因为它可以在下一次构建期间恢复)。

您可以调用该setDerived方法IResource

org.eclipse.core.resources.IResource.setDerived(boolean, IProgressMonitor)

或者当您创建文件时,可以将其创建为派生文件,但调用如下:

newFile.create(流,IResource.DERIVED,监视器);

但是,您DERIVED不能通过 setContents 设置标志,在这种情况下您必须显式调用setDerived(true)

从文档:

派生资源是在翻译、编译、复制或以其他方式处理其他文件的过程中创建的常规文件或文件夹。派生资源不是原始数据,可以从其他资源重新创建。从版本和配置管理中排除派生资源是司空见惯的,否则它们会在每个用户重新生成这些不断变化的文件的版本时使团队存储库变得混乱。

于 2013-04-18T21:58:02.073 回答