1

プロジェクトのクラスパスの変更に応答する必要があるEclipseプラグインに取り組んでいます(キャッシュエントリを無効にするため)。特に、クラスパスコンテナに含まれるリソースの変更を検出する方法を探しています。たとえば、「Maven->依存関係の更新」アクションの後に変更されるm2eclipseコンテナのjarです。

このような変更はイベントを発生させないようです(私はElementChangedEventとResourceEventをリッスンしています)。要素がコンテナに追加/削除されると、イベントが表示されますが、基になるリソースが変更されたときは表示されません。

そのような変化を検出することが可能かどうか誰かが知っていますか?

4

3 に答える 3

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

この抜粋が持ち上げられた完全なコードはこちら

于 2015-01-02T20:44:13.540 に答える
2

やりたいことは、Java モデルの変更をリッスンすることです。すべてのイベントが表示されます。次に、反応したくないものを除外するだけです。このようなものから始める必要があります...

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

JavaCore.addElementChangedListener( listener, ElementChangedEvent.POST_CHANGE );
于 2012-04-16T17:17:23.520 に答える
-1

IFileプロジェクトのクラスパスは単純な--としてプロジェクトに保存され.classpathます。したがって、このリソースの変更イベントをリッスンして変更を取得する必要があります。Java ベースのプロジェクトには常に存在します。

于 2012-04-16T11:53:34.633 に答える