在Eclipse控制台中输出信息

5

我的插件需要写入到Eclipse控制台 - 为了测试目的,我简化了代码,只剩下以下内容:

public void start(BundleContext context) throws Exception {
        super.start(context);
        plugin = this;
        System.out.println("Tecomp Plugin is running");

        MessageConsole myConsole = new MessageConsole("My Console", null);
        //myConsole.activate();
        ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[]{ myConsole });
        ConsolePlugin.getDefault().getConsoleManager().showConsoleView(myConsole);
        final MessageConsoleStream stream = myConsole.newMessageStream();
        stream.setActivateOnWrite(true);
        stream.println("Hi there!");
        stream.close();
    }

这是一个简单的插件,start方法属于扩展AbstractUIPlugin类的类 - 它不是rcp应用程序。代码在运行时工作台中正常工作 - 一旦安装了插件,输出就会丢失。插件的其余部分正常工作。
也许控制台插件有问题?或者流在运行时工作台和开发工作台中处理方式不同?
我尝试了两种方法 - 通过功能项目和直接将插件jar复制到eclipse目录中进行插件安装 - 两种方法都有相同的结果...
欢迎任何帮助,因为我已经苦恼了一段时间...
问候,卡蒂
编辑:
似乎不是控制台的问题...我提供了自己的视图来打印输出,但是虽然在plugin.xml中声明了该视图,在安装插件后却没有视图...这是我所做的: -使用ExportWizard将插件导出为jar存档 -将此存档复制到/usr/share/eclipse/plugins -重新启动eclipse 或者使用功能项目: -使用ExportWizard导出包含我的插件的feature项目 -从eclipse目录中删除上述jar存档 -安装特性 -重新启动eclipse 两者都没有奏效 - 我在安装插件时错过了什么吗? Jar存档没问题,我已经检查过,它是最新版本。但不知何故,似乎eclipse仍在使用某些旧插件,并没有我所做的更改。
问候,卡蒂
编辑:
我实现了IStartup接口并扩展了org.eclipse.ui.startup点,但没有任何改变...我真的认为这是一种安装问题。我注释掉了一些输出,但仍会打印到调试控制台。 在eclipse中是否有某种插件缓存?以至于新代码无法读取?
编辑:
感谢您的建议,但使用-clean选项启动eclipse没有帮助 - 我将尝试在下周在其他环境中安装插件 - 也许我的环境存在问题...
编辑:
调用编译器的类中的代码如下:
private MessageConsole findConsole(String name){
  ConsolePlugin plugin = ConsolePlugin.getDefault();
  IConsoleManager conMan = plugin.getConsoleManager();
  IConsole[] existing = conMan.getConsoles();
  for (int i = 0; i<existing.length; i++){
    if (name.equals(existing[i].getName())){
      return (MessageConsole)existing[i];
    }
  }
  //no console found -> create new one
  MessageConsole newConsole = new MessageConsole(name, null);
  conMan.addConsoles(new IConsole[]{newConsole});
  return newConsole;
}



public void run() {
  MessageConsole console = findConsole("tecompConsole");
  //display the tecomp Console
  IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
  String id = IConsoleConstants.ID_CONSOLE_VIEW;
  try {
    IConsoleView view = (IConsoleView) page.showView(id);
    view.display(console);
  } catch (PartInitException e) {
    e.printStackTrace();
  }
  MessageConsoleStream output = console.newMessageStream();
  String tecompPath = TecompPlugin.getDefault().getPreferenceStore().getString(IEiffelConstants.TECOMP_PATH);
  if (checkTecompPath(tecompPath)){
    String line;
    String[] cmd = {tecompPath, pathToAceFile};
    try{
      output.println("calling tecomp");
      Process tecomp = Runtime.getRuntime().exec(cmd);
      //capture stdout und stderr from tecomp
      BufferedReader input = new BufferedReader(
          new InputStreamReader(tecomp.getInputStream()));
      BufferedReader err = new BufferedReader(
          new InputStreamReader(tecomp.getErrorStream()));
      while ((line = input.readLine()) != null ){
        output.println(line);
      }  
      input.close();
      while ((line = err.readLine()) != null){
        output.println(line);
      }
      err.close();
      output.close();
      tecomp.waitFor();
      //System.out.println(tecomp.exitValue());
    }catch (Exception err){
      err.printStackTrace();
    }
  } else {
    try{
    output.println("please specify a tecomp path");
    output.close();
    }catch (Exception err){}
  }
}

但是第一个测试例子应该能够工作,不是吗?我创建了一个新的MessageConsoleStream并手动写入它。这正好像我找到的例子一样。

编辑:

这段代码不属于rcp应用程序 - 它只是一个插件,扩展了eclipse ide对eiffel编程语言的支持。所以我认为你的建议对我的插件不起作用 - VonC,至少我不知道把你的代码放在哪里......

我最初问题中的第一个示例代码在扩展AbstractUIPlugin的Plugin类内部的start(BundleContext context)方法中被调用。我的插件正在运行,所以某个地方会调用这个方法。而且正如我所提到的 - 插件在运行时工作得很好......

如果这不是一个额外解释我的问题的正确位置,我很抱歉 - 但似乎这是系统允许我发布一些进一步的内容的唯一地方。对你的答案的评论对我来说是不允许的,因为我刚刚注册并且没有足够的声望点数......所以,如果我使用系统错误,请纠正我 :) 谢谢


Eclipse控制台有一个列表,当单击左上角的小三角形(向下指)时会显示出来。您的控制台是否显示在那里?我相信应该是的。如果是的话,请选择控制台以查看您在那里记录的内容。 - daanish.rumani
不,我的控制台没有出现在那里。 - Kathi
5个回答

3

你有检查"在你的RCP应用程序中显示控制台"吗?

在创建和运行工作台之前,在Application.java run()中完成以下简短代码是否开始以至少符合你的期望?

MessageConsole console = new MessageConsole(”System Output”, null);
ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { console });
ConsolePlugin.getDefault().getConsoleManager().showConsoleView(console);
MessageConsoleStream stream = console.newMessageStream();

System.setOut(new PrintStream(stream));
System.setErr(new PrintStream(stream));

logger = LoggerFactory.getLogger(Application.class); // Previously declared.

(即,当您的插件安装在Eclipse中时,是否会显示控制台?)

1

我认为问题在于您的插件没有被启动。您展示的代码只有在其他插件尝试访问您的插件中的某些内容时才会被激活。这似乎是您的调试启动配置的情况,但不适用于打包的应用程序。

您可以尝试实现IStartup接口,并在您的插件中使用org.eclipse.ui.startup扩展点,以便在UI加载时强制初始化。这将激活您的插件并执行您拥有的控制台代码。

您是否可以在start()方法中添加一些日志记录语句或断点,以确保它在您部署的应用程序上被调用?


完全没有帮助 - 请看我上面的编辑。runtime-workbench正常工作 - 就像以前一样。插件安装后肯定在运行,语法高亮等功能也可以使用 - 但是似乎是某个旧版本在运行...不知道问题出在哪里。 - Kathi

0
听起来你试图将插件安装到的 Eclipse 应用程序可能没有安装你需要作为插件依赖项的 org.eclipse.ui.console 插件。你是否检查过你的插件是否具有正确的插件依赖关系,并且已经顺利安装了呢?

我的插件中列出了org.eclipse.ui.console作为依赖项,并且它也已经安装在Eclipse应用程序中。插件可以顺利安装... - Kathi

0

您可能需要清除OSGI和Eclipse运行时使用的缓存数据。您可以通过将-clean参数添加到Eclipse命令行来完成。

以下是Plug-in Dev Guide中相关的信息:

清理OSGi框架和Eclipse运行时使用的缓存数据。如果在安装、更新或使用共享配置后观察到启动错误,请尝试使用此选项运行Eclipse一次。

请参阅Eclipse 运行时选项获取更多信息。

您可能还想考虑使用更新站点。我通常使用本地更新站点在测试时安装插件,因为它似乎不容易出错。Eclipse FAQ上有一篇关于创建更新站点的简短文章。


0
另一个可能性是您安装的插件已经被缓存在了安装中。您可以使用 -clean 选项启动 Eclipse,以从工作区中删除所有缓存的插件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接