写入Eclipse控制台

时间:2009-04-06 10:57:29

标签: java eclipse eclipse-plugin console

我的插件必须写入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();
    }

这是一个简单的插件,方法开始跟随扩展AbstractUIPlugin的类 - 它不是rcp应用程序。 代码在运行时工作台内运行良好 - 一旦安装了插件,输出就会丢失。插件的其余部分工作正常。

ConsolePlugin可能有问题吗?或者是在运行时工作台和开发工作台中以不同方式处理流?

我尝试了两个 - 一个功能项目并直接将插件jar复制到eclipse目录 - 用于安装插件 - 两者的结果相同......

欢迎任何帮助,因为我现在已经解决了这个问题......

此致,Kathi

编辑:

它似乎不是控制台的问题......我提供了自己的视图来打印输出,但是虽然在plugin.xml中声明了安装插件后没有视图...这里是什么我做了: - 使用ExportWizard将插件导出到jar-archive中 - 将此存档复制到/ usr / share / eclipse / plugins - 重新开始的日食

或使用功能项目: - 使用ExportWizard导出包含我的插件的功能项目 - 从eclipse dir中删除了上面的jar存档 - 安装该功能 - 重新开始的日食

两者都没有说 - 我安装插件时出了什么问题? jar-archive是好的,我查了一下 - 这是最新版本。但不知何故,似乎eclipse仍在使用一些较旧的插件而没有我做出的改变

问候,Kathi

编辑:

我实现了IStartup接口端扩展了org.eclipse.ui.startup点,但没有改变......我真的认为这是一个安装问题。我注释掉了一些输出,但它仍然打印到调试控制台。 eclipse中是否有某种插件缓存?那么新代码无法读取?

编辑:

感谢您的建议,但是使用-clean选项启动eclipse没有帮助 - 我将尝试在下周的其他环境中安装插件 - 也许我的内容有问题......

编辑:

调用compilier的类中的代码如下所示:

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应用程序不相符 - 它只是一个插件,通过支持eiffel编程语言扩展了eclipse ide。所以我认为你的建议对我的插件不起作用--VonC,至少我不知道你的代码放在哪里...... 我在初始问题中的第一个示例代码在Plugin类中被调用,该类在start(BundleContext context)方法中扩展AbstractUIPlugin。我的插件在运行,所以这个方法被调用。正如我所提到的 - 插件在运行时工作台内工作正常......

我很抱歉,如果这不是解释我问题的正确位置 - 但它似乎是系统允许我发布更多行的唯一地方。我不允许对你的答案进行评论,因为我刚刚登录并为此我没有足够的声誉点...所以,请纠正我,如果我使用的系统错了:) thx

5 个答案:

答案 0 :(得分:3)

您是否检查了"Displaying the console in your RCP application"

下面的小代码(在创建和运行工作台之前在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 :(得分:1)

我认为问题是你的插件没有启动。在其他插件尝试访问插件中的内容之前,您显示的代码不会被激活。您的调试启动配置似乎就是这种情况,但打包的应用程序却不是这样。

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

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

答案 2 :(得分:0)

对我来说,你尝试安装插件的eclipse应用程序可能没有安装你需要作为插件依赖项的org.eclipse.ui.console插件。您是否检查过您的插件是否具有正确的插件依赖项并且安装时没有问题?

答案 3 :(得分:0)

您可能必须清除OSGI和eclipse运行时使用的缓存数据。您可以通过将-clean参数添加到eclipse命令行来完成此操作。

以下是插件开发指南中的相关信息:

  

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

有关详细信息,请参阅Eclipse runtime options

您可能还想检查使用更新站点。我经常使用本地更新站点在测试时安装插件,因为它似乎不易出错。 Eclipse FAQ有一篇关于如何create an update site的快速文章。

答案 4 :(得分:0)

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