Java 我的eclipse插件创建了无休止的工作区构建循环,可能与工作相关

Java 我的eclipse插件创建了无休止的工作区构建循环,可能与工作相关,java,eclipse,build,eclipse-plugin,workspace,Java,Eclipse,Build,Eclipse Plugin,Workspace,我已经创建了一个插件来钩住save操作,并创建一个经过编辑的javascript文件的缩小javascript文件。您可以在这个问题中看到完整的代码: 问题是,由于Juno,这个插件在工作区构建过程中创建了无限循环。 它首先开始缩小一个我根本没有更改的文件。这个文件在构建中创建了一个无止境的循环。完成缩小文件后,它将启动新的工作区构建并再次缩小文件,以此类推。 但过了一段时间后,情况会变得更糟,尤其是在新的eclipse开始时。突然间,有十几个我从未接触过的文件被缩小了。 如果我卸载我的插件,然

我已经创建了一个插件来钩住save操作,并创建一个经过编辑的javascript文件的缩小javascript文件。您可以在这个问题中看到完整的代码:

问题是,由于Juno,这个插件在工作区构建过程中创建了无限循环。 它首先开始缩小一个我根本没有更改的文件。这个文件在构建中创建了一个无止境的循环。完成缩小文件后,它将启动新的工作区构建并再次缩小文件,以此类推。 但过了一段时间后,情况会变得更糟,尤其是在新的eclipse开始时。突然间,有十几个我从未接触过的文件被缩小了。 如果我卸载我的插件,然后让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();

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

您可以在
IResource
上调用
setDerived
方法:

org.eclipse.core.resources.IResource.setDerived(boolean, IProgressMonitor)
或者在创建文件时,可以将其创建为派生文件,但调用如下:

create(stream,IResource.DERIVED,monitor)

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

从文档中:

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


如果我停用“Project->Build Automatically”,它可以正常工作。手动生成项目不会生成此错误。这似乎只有在自动构建工作区时才会发生。我猜这是一个输入错误,您有一个嵌套的run()方法声明。但更重要的是,newFile位于何处?如果该文件不在输出文件夹中,则对该文件的任何更改都将触发增量生成。如果您不希望新文件触发构建,那么将其设置为派生。是的,我认为这是一个输入错误。NewFile位于工作区中,与保存的文件位于同一文件夹中。触发构建是可以的。但有时它会导致一次又一次的建筑循环。将其设置为“派生”是什么意思?我该怎么做?看看下面我的答案…我可能已经接近答案了。似乎我已经在eclipse上安装了一个名为“JavaScript开发工具”的插件。我也安装了PDT,它还可以为项目添加JavaScript支持。因此,可能冲突本身,可能这两者只是相同的东西,只有一次包含在PDT中。如果我卸载“JDT”,它仍然不起作用,但验证器即不会被删除。我现在只使用PDT和我的插件安装了一个空白的eclipse安装,第一次测试让我感到乐观……不幸的是,这并没有改变错误的行为。