コンスタンティンの答えは基本的に正しいですが、不完全です。これがより完全な答えです。
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);
        }
    }
}
この抜粋が持ち上げられた完全なコードはこちら