2012-04-16 8 views
0

私はプロジェクトのクラスパス(キャッシュエントリを無効にする)の変更に応答する必要があるEclipseプラグインに取り組んでいます。特に、クラスパスコンテナに含まれるリソースの変更を検出する方法を探しています。 "Maven - > Update Dependencies"アクションの後に変更されるm2eclipseコンテナ内のjarです。Eclipseクラスパスコンテナの内容の変更を検出する方法は?

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

このような変更を検出できるかどうかは知っていますか?

答えて

-1

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

+2

残念ながら、クラスパスの容器の場合には.classpathファイルには、容器のみではなく、ITリソースの内部への参照が含まれています。それができたなら、私が罠に掛けたいと思うように助けてくれるとは思わない。コンテナ内のジャーは同じ名前を保持するが、コンテンツを変更する。 Mavenスナップショットの依存関係を更新します。 – matthewSpleep

1

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

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

JavaCore.addElementChangedListener(listener, ElementChangedEvent.POST_CHANGE); 
2

コンスタンチンの答えは基本的に正しいが不完全です。ここでより完全な答えがあります。

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

関連する問題