如何检测Eclipse类路径容器内容的更改?
问题描述:
我正在研究需要响应项目类路径中的更改(以使高速缓存条目无效)的Eclipse插件。具体而言,我正在寻找一种方法来检测对类路径容器中包含的资源的更改,例如m2eclipse容器中的一个jar,在“Maven - > Update Dependencies”操作后发生变化。如何检测Eclipse类路径容器内容的更改?
像这样的改变似乎没有引发任何事件(我正在监听ElementChangedEvent和ResourceEvent)。当元素从容器中添加/删除时,我会看到事件,但不会在底层资源发生变化时看到。
有谁知道是否有可能检测到这种变化?
答
项目的类路径在项目中保存为简单的IFile
- .classpath
。所以你应该通过监听此资源上的更改事件来获取更改。它总是存在于基于Java的项目中。
答
你想要做的就是倾听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
不幸的是在类路径容器的情况下.classpath文件只包含,而不是它里面的资源,以容器的引用。如果是这样,我仍然认为它不会有帮助,因为我想陷入困境的情况是,例如,容器中的罐子保留相同的名称,但改变了内容,例如更新Maven快照依赖关系。 – matthewSpleep 2012-04-16 12:50:47