我正在开发一个Eclipse插件,它需要响应项目类路径中的更改(以使缓存条目无效)。特别是我正在寻找一种方法来检测类路径容器中包含的资源的变化,例如m2eclipse容器中的jar在“Maven - > Update Dependencies”操作之后发生变化。
这样的更改似乎没有引发任何事件(我正在侦听ElementChangedEvent和ResourceEvent)。当从容器中添加/删除元素时,我会看到事件,但在基础资源发生变化时却看不到。
有谁知道是否可以检测到这些变化?
答案 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的项目中。