Как обнаружить изменения в содержимом контейнера Eclipse classpath?
Я работаю над плагином Eclipse, который должен реагировать на изменения в пути к классам проекта (чтобы сделать записи в кэше недействительными). В частности, я ищу способ обнаружения изменений в ресурсах, содержащихся в контейнере classpath, например, в jar-контейнере m2eclipse, изменяющемся после действия "Maven -> Update Dependencies".
Подобные изменения не вызывают каких-либо событий (я слушаю ElementChangedEvent и ResourceEvent). Когда элементы добавляются / удаляются из контейнера, я вижу события, но не при изменении базовых ресурсов.
Кто-нибудь знает, возможно ли обнаружить такие изменения?
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);
}
}
}
Полный код, из которого был извлечен этот отрывок, находится здесь
То, что вы хотите сделать, это слушать изменения модели Java. Вы увидите все события. Тогда это просто вопрос фильтрации того, на что вы не хотите реагировать. Как-то так должно начаться...
IElementChangedListener listener = new IElementChangedListener()
{
public void elementChanged( final ElementChangedEvent event )
{
...
}
};
JavaCore.addElementChangedListener( listener, ElementChangedEvent.POST_CHANGE );
Путь к классам проекта сохраняется как простой IFile
- .classpath
- в проекте. Таким образом, вы должны получить изменения, прослушивая событие change на этом ресурсе. Он всегда существует для проектов на основе Java.