1

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

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

有谁知道是否有可能检测到这种变化?

4

3 回答 3

3

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

1) 您注册一个 IJavaElementChangeListene 并监听“POST_CHANGE_EVENTS”。(见康斯坦丁的例子)。

2) 当您收到更改事件时,您将增量向下移动到 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);
        }
    }
}

摘录此摘录的完整代码在这里

于 2015-01-02T20:44:13.540 回答
2

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

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

JavaCore.addElementChangedListener( listener, ElementChangedEvent.POST_CHANGE );
于 2012-04-16T17:17:23.520 回答
-1

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

于 2012-04-16T11:53:34.633 回答