写入Eclipse控制台

我的插件必须写入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可能有问题吗? 或者在运行时工作台和开发工作台中处理不同的流?

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

欢迎任何帮助,因为我现在已经解决了这个问题一段时间了……

此致,凯西

编辑:

它似乎不是控制台的问题…我提供了我自己的视图来打印输出,但虽然在plugin.xml中声明,安装插件后没有视图…这是我做的: – 使用ExportWizard将插件导出到jar-archive -copied这个存档到/ usr / share / eclipse / plugins -restarted eclipse

或者使用一个function项目: – 使用ExportWizard导出包含我的插件的function项目 – 从eclipse dir中删除上面的jar存档 – 安装了function – 重新启动eclipse

两个都没说 – 安装插件我有什么问题吗? jar存档还可以,我查了一下 – 这是最新版本。 但不知何故,似乎eclipse仍在使用一些较旧的插件而没有我所做的更改

问候,卡蒂

编辑:

我实现了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 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,至少我不知道在哪里放你的代码……我在插件类中调用初始问题中的第一个示例代码,在开始时扩展AbstractUIPlugin( BundleContext context)方法。 我的插件在运行,所以这个方法被调用。 正如我所提到的 – 插件在运行时工作台内运行良好…

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

您是否选中了“ 在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中时,它会自动显示一个控制台吗?)

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

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

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

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

您可能必须清除OSGI和eclipse运行时使用的缓存数据。 您可以通过在eclipse命令行中添加-clean参数来实现。

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

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

有关更多信息,请参阅Eclipse 运行时选项 。

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

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