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

问题描述:

我正在研究需要响应项目类路径中的更改(以使高速缓存条目无效)的Eclipse插件。具体而言,我正在寻找一种方法来检测对类路径容器中包含的资源的更改,例如m2eclipse容器中的一个jar,在“Maven - > Update Dependencies”操作后发生变化。如何检测Eclipse类路径容器内容的更改?

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

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

项目的类路径在项目中保存为简单的IFile - .classpath。所以你应该通过监听此资源上的更改事件来获取更改。它总是存在于基于Java的项目中。

+2

不幸的是在类路径容器的情况下.classpath文件只包含,而不是它里面的资源,以容器的引用。如果是这样,我仍然认为它不会有帮助,因为我想陷入困境的情况是,例如,容器中的罐子保留相同的名称,但改变了内容,例如更新Maven快照依赖关系。 – matthewSpleep 2012-04-16 12:50:47

你想要做的就是倾听Java模型的变化。你会看到所有的事件。然后,它只是过滤出你不想对此做出反应的问题。像这样的东西应该让你开始...

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

JavaCore.addElementChangedListener(listener, ElementChangedEvent.POST_CHANGE); 

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

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); 
     } 
    } 
} 

从这个片段被取消的完整源代码here