2012-04-16 73 views
0

我正在研究需要響應項目類路徑中的更改(以使高速緩存條目無效)的Eclipse插件。具體而言,我正在尋找一種方法來檢測對類路徑容器中包含的資源的更改,例如m2eclipse容器中的一個jar,在「Maven - > Update Dependencies」操作後發生變化。如何檢測Eclipse類路徑容器內容的更改?

像這樣的改變似乎沒有引發任何事件(我正在監聽ElementChangedEvent和ResourceEvent)。當元素從容器中添加/刪除時,我會看到事件,但不會在底層資源發生變化時看到。

有誰知道是否有可能檢測到這種變化?

回答

-1

項目的類路徑在項目中保存爲簡單的IFile - .classpath。所以你應該通過監聽此資源上的更改事件來獲取更改。它總是存在於基於Java的項目中。

+2

不幸的是在類路徑容器的情況下.classpath文件只包含,而不是它裏面的資源,以容器的引用。如果是這樣,我仍然認爲它不會有幫助,因爲我想陷入困境的情況是,例如,容器中的罐子保留相同的名稱,但改變了內容,例如更新Maven快照依賴關係。 – matthewSpleep 2012-04-16 12:50:47

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