草庐IT

java - 更新到 juno (eclipse 4) 后,eclipse 插件不起作用

coder 2024-04-02 原文

我创建了一个 eclipse 插件,它将挂接到保存操作以使用 goolge 闭包编译器创建一个缩小的 javascript 文件。请参阅下面的文件。 这在 eclipse 3.7.2 之前一直有效。不幸的是,现在在 eclipse 4.2.1 中,这似乎有时会造成无限循环。作业“编译 .min.js”(ResourceChangedListener.java 中的第 64 行)似乎是原因。这会导致 workspaced 开始一遍又一遍地构建。我想这是因为该作业创建或更改了一个文件,再次触发工作区构建,这再次触发了触发构建的作业,依此类推。 但我不知道如何防止这种情况。

//激活器.java

package closure_compiler_save;

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;

/**
 * The activator class controls the plug-in life cycle
 */
public class Activator extends AbstractUIPlugin  {

    // The plug-in ID
    public static final String PLUGIN_ID = "closure-compiler-save"; //$NON-NLS-1$

    // The shared instance
    private static Activator plugin;

    /**
     * The constructor
     */
    public Activator() {
    }

    @Override
      public void start(BundleContext context) throws Exception {
        super.start(context);
        Activator.plugin = this;

        ResourceChangedListener listener = new ResourceChangedListener();
          ResourcesPlugin.getWorkspace().addResourceChangeListener(listener);
    }

    @Override
      public void stop(BundleContext context) throws Exception {
        Activator.plugin = null;
        super.stop(context);
    }

    /**
     * Returns the shared instance
     *
     * @return the shared instance
     */
    public static Activator getDefault() {
        return plugin;
    }
}

//ResourceChangedListener.java

package closure_compiler_save;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;

public class ResourceChangedListener implements IResourceChangeListener {

    public void resourceChanged(IResourceChangeEvent event) {
        if (event.getType() != IResourceChangeEvent.POST_CHANGE)
            return;

        IResourceDelta delta = event.getDelta();
        try {
            processDelta(delta);
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }

    // find out which class files were just built
    private void processDelta(IResourceDelta delta) throws CoreException {

        IResourceDelta[] kids = delta.getAffectedChildren();
        for (IResourceDelta delta2 : kids) {
            if (delta2.getAffectedChildren().length == 0) {
                if (delta.getKind() != IResourceDelta.CHANGED)
                    return;

                IResource res = delta2.getResource();
                if (res.getType() == IResource.FILE && "js".equalsIgnoreCase(res.getFileExtension())) {
                    if (res.getName().contains("min"))
                        return;
                    compile(res);
                }
            }
            processDelta(delta2);
        }
    }

    private void compile(final IResource res) throws CoreException {

        final IPath fullPath = res.getFullPath();
        final IPath fullLocation = res.getLocation();
        final String fileName = fullPath.lastSegment().toString();
        final String outputFilename = fileName.substring(0, fileName.lastIndexOf(".")).concat(".min.js");
        final String outputPath = fullPath.removeFirstSegments(1).removeLastSegments(1).toString();

        final IProject project = res.getProject();
        final IFile newFile = project.getFile(outputPath.concat("/".concat(outputFilename)));
        Job compileJob = new Job("Compile .min.js") {
            public IStatus run(IProgressMonitor monitor) {
                byte[] bytes = null;
                try {
                    bytes = CallCompiler.compile(fullLocation.toString(), CallCompiler.SIMPLE_OPTIMIZATION).getBytes();

                    InputStream source = new ByteArrayInputStream(bytes);
                    if (!newFile.exists()) {
                        newFile.create(source, IResource.NONE, null);
                    } else {
                        newFile.setContents(source, IResource.NONE, null);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (CoreException e) {
                    e.printStackTrace();
                }
                return Status.OK_STATUS;
            }
        };
        compileJob.setRule(newFile.getProject()); // this will ensure that no two jobs are writing simultaneously on the same file
        compileJob.schedule();
    }

}

最佳答案

在我设置了一个空白的 eclipse 经典环境之后,在那里启动了一个新的 eclipse 插件项目并重新创建了它部分再次运行的所有文件。 在这个启动调试 session 的环境中,我可以保存 .js 文件并自动创建 .min.js 文件。 到目前为止,一切都很好! 但是当我将插件安装到我真正的开发 eclipse 环境时,自动保存不起作用。

至少更进一步!

第 2 步: 有一些文件没有包含在显然需要的构建中,比如 list 。不知道为什么他们被取消选择。 无论如何,似乎只是设置了一个空白的 eclipse 4 classic 并通过 eclipse 插件向导解决了我原来的问题。我仍然很想知道实际问题是什么......

关于java - 更新到 juno (eclipse 4) 后,eclipse 插件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15159755/

有关java - 更新到 juno (eclipse 4) 后,eclipse 插件不起作用的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  3. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  4. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  5. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  6. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

随机推荐