【问题标题】:How to detect changes to Eclipse classpath container contents?如何检测对 Eclipse 类路径容器内容的更改?
【发布时间】:2012-04-16 11:13:28
【问题描述】:

我正在开发一个 Eclipse 插件,该插件需要响应项目类路径中的更改(以使缓存条目无效)。特别是我正在寻找一种方法来检测类路径容器中包含的资源的更改,例如m2eclipse 容器中的 jar 在“Maven -> Update Dependencies”操作后发生变化。

这样的更改似乎不会引发任何事件(我正在监听 ElementChangedEvent 和 ResourceEvent)。当从容器中添加/删除元素时,我会看到事件,但当底层资源发生变化时却看不到。

有谁知道是否可以检测到这种变化?

【问题讨论】:

    标签: eclipse eclipse-plugin


    【解决方案1】:

    康斯坦丁的回答基本正确,但不完整。这是一个更完整的答案。

    1) 您注册一个 IJavaElementChangeListene 并监听“POST_CHANGE_EVENTS”。 (参见康斯坦丁的例子)。

    2) 当您收到更改事件时,您将增量向下移动到 IJavaProject 级别并查找符合以下条件的事件 设置了标志 IJavaElementDelta.F_CLASSPATH_CHANGED 或 IJavaElementDelta.F_RESOLVED_CLASSPATH_CHANGED。如这段代码sn-p:

    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

    【讨论】:

      【解决方案2】:

      您要做的是监听 Java 模型的变化。您将看到所有事件。然后就是过滤掉你不想做出反应的事情。这样的事情应该让你开始......

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

      【讨论】:

        【解决方案3】:

        项目的类路径保存为一个简单的IFile - .classpath - 在项目中。因此,您应该通过侦听此资源上的更改事件来获取更改。它始终存在于基于 Java 的项目中。

        【讨论】:

        • 不幸的是,对于类路径容器,.classpath 文件只包含对容器的引用,而不是其中的资源。如果确实如此,我仍然认为它不会有帮助,因为我想要捕获的情况是,例如容器中的 jar 保留相同的名称,但会更改内容,例如更新 Maven 快照依赖项。
        猜你喜欢
        • 2011-01-06
        • 1970-01-01
        • 2017-01-16
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 2012-10-10
        • 2010-10-09
        相关资源
        最近更新 更多