我想为Eclipse创建一个插件。问题是,我查看了API和示例,并设法在主栏上创建了一个带有特定图标的按钮,当我单击它时,打开一个InputDialog。
困难的部分是,我想从这个按钮启动一个应用程序,但不是Runtime,因为它是一个新进程。我只是想在插件中启动一个类,它将登录到服务器并从中获取一些输出。我希望它可以在控制台中打开,比如启动普通应用程序或单独的控制台。
此类最好的示例是启动Tomcat的Tomcat插件,然后将控制台输出到Eclipse控制台。我也想这样做。我看过Tomcat源代码插件,但我也被困在那里了。他们使用自己的发射器。
答案 0 :(得分:1)
我不确定你的意思是“我想简单地开始上课”。我假设您要执行命令行工具并将其输出重定向到控制台窗口。
为了能够在不生成新进程的情况下执行此操作,您必须能够控制工具的输出流。如果无法控制,那么您别无选择,只能启动新流程以正确捕获工具的输出。
技术上可以调用System.setOut
,但它会将所有线程的输出重定向到您不想要的控制台。
然而,您首先要创建一个控制台:
// function findConsole copied from:
// http://wiki.eclipse.org/FAQ_How_do_I_write_to_the_console_from_a_plug-in%3F
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, so create a new one.
MessageConsole myConsole = new MessageConsole(name, null);
conMan.addConsoles(new IConsole[]{myConsole});
return myConsole;
}
// Find my console
MessageConsole cons = findConsole("MyTool Console");
MessageConsoleStream out = cons.newMessageStream();
// Optionally get it's input stream so user can interact with my tool
IOConsoleInputStream in = cons.getInputStream();
// Optionally make a differently coloured error stream
MessageConsoleStream err = cons.newMessageStream();
err.setColor(display.getSystemColor(SWT.COLOR_RED));
// Display the console.
// Obtain the active page. See: http://wiki.eclipse.org/FAQ_How_do_I_find_the_active_workbench_page%3F
IWorkbenchPage page = ...;
String id = IConsoleConstants.ID_CONSOLE_VIEW;
IConsoleView view = (IConsoleView) page.showView(id);
view.display(cons);
然后设置我的工具的输入和输出流,并在另一个线程中开始处理,这样UI就不会阻塞。
// Create my tool and redirect its output
final MyTool myTool = new MyTool();
myTool.setOutputStream(out);
myTool.setErrorStream(err);
myTool.setInputStream(in);
// Start it in another thread
Thread t = new Thread(new Runnable() {
public void run() {
myTool.startExecuting();
}
});
t.start();
如果您的工具不支持I / O重定向,您别无选择,只能使用ProcessBuilder
在另一个进程中启动它,并使用多个线程在控制台和进程流之间移动数据请参阅:{{ 1}},Process.getInputStream()
和Process.getOutputStream()
。
以下链接包含其他有用的详细信息:
答案 1 :(得分:1)
这是运行带控件的新控制台的代码,例如stop delete和deleteAll!这是我在开始时要求的,但消息控制台很有用!
ILaunchConfigurationType launchType = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType("org.eclipse.jdt.launching.localJavaApplication");
ILaunchConfigurationWorkingCopy config = null;
try {
config = launchType.newInstance(null, "My Plugin working");
} catch (CoreException e) {
System.err.println(e.getMessage());
}
config.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, "org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector");
String[] classpath = new String[] { "C:\\Users\\Administrator\\Documents\\myjr.jar" };
ArrayList classpathMementos = new ArrayList();
for (int i = 0; i < classpath.length; i++) {
IRuntimeClasspathEntry cpEntry = JavaRuntime.newArchiveRuntimeClasspathEntry(new Path(classpath[i]));
cpEntry.setClasspathProperty(IRuntimeClasspathEntry.USER_CLASSES);
try {
classpathMementos.add(cpEntry.getMemento());
} catch (CoreException e) {
System.err.println(e.getMessage());
}
}
config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, false);
config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH, classpathMementos);
config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, "collectorlog.handlers.MyClass");
try {
ILAUNCH = config.launch(ILaunchManager.RUN_MODE, null);
} catch (CoreException e) {
System.err.println(e.getMessage());
}