如何检测Eclipse类路径容器内容的更改?

时间:2012-04-16 11:13:29

标签: eclipse eclipse-plugin

我正在开发一个Eclipse插件,它需要响应项目类路径中的更改(以使缓存条目无效)。特别是我正在寻找一种方法来检测类路径容器中包含的资源的变化,例如m2eclipse容器中的jar在“Maven - > Update Dependencies”操作之后发生变化。

这样的更改似乎没有引发任何事件(我正在侦听ElementChangedEvent和ResourceEvent)。当从容器中添加/删除元素时,我会看到事件,但在基础资源发生变化时却看不到。

有谁知道是否可以检测到这些变化?

3 个答案:

答案 0 :(得分:2)

康斯坦丁的回答基本上是正确的,但不完整。这是一个更完整的答案。

1)您注册了IJavaElementChangeListene并侦听'POST_CHANGE_EVENTS'。 (参见Konstantin的例子)。

2)当您收到更改事件时,您将delta向下移动到IJavaProject级别并查找事件 有标志IJavaElementDelta.F_CLASSPATH_CHANGED或IJavaElementDelta.F_RESOLVED_CLASSPATH_CHANGED设置。与此代码段中一样:

class MyListener implements IElementChangedListener {

    @Override
    public void elementChanged(ElementChangedEvent event) {
        visit(event.getDelta());
    }

    private void visit(IJavaElementDelta delta) {
        IJavaElement el = delta.getElement();
        switch (el.getElementType()) {
        case IJavaElement.JAVA_MODEL:
            visitChildren(delta);
            break;
        case IJavaElement.JAVA_PROJECT:
            if (isClasspathChanged(delta.getFlags())) {
                notifyClasspathChanged((IJavaProject)el);
            }
            break;
        default:
            break;
        }
    }

    private boolean isClasspathChanged(int flags) {
        return 0!= (flags & (
                IJavaElementDelta.F_CLASSPATH_CHANGED | 
                IJavaElementDelta.F_RESOLVED_CLASSPATH_CHANGED
        ));
    }

    public void visitChildren(IJavaElementDelta delta) {
        for (IJavaElementDelta c : delta.getAffectedChildren()) {
            visit(c);
        }
    }
}

解除此摘录的完整代码是here

答案 1 :(得分:1)

您要做的是听取Java模型的更改。你会看到所有的事件。然后就是过滤掉你不想做出反应的事情。这样的事情应该让你开始......

IElementChangedListener listener = new IElementChangedListener()
{
    public void elementChanged( final ElementChangedEvent event )
    {
        ...
    }
};

JavaCore.addElementChangedListener( listener, ElementChangedEvent.POST_CHANGE );

答案 2 :(得分:-1)

项目的类路径在项目中保存为简单的IFile - .classpath。因此,您通过侦听此资源上的更改事件来获取更改。它总是存在于基于Java的项目中。