我的插件必须写入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 -copied这个存档到/ usr/share/eclipse/plugins -restarted eclipse
或者使用一个功能项目: - 使用ExportWizard导出包含我的插件的功能项目 - 从eclipse目录中删除上面的jar存档 - 安装了功能 - 重新启动eclipse
两个都没有说 - 安装插件我有什么问题吗?jar-archive是好的,我查了一下 - 这是最新版本.但不知何故,似乎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; icreate 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