Eclipse插件 - 如何运行外部类

时间:2011-10-09 15:32:58

标签: eclipse plugins

我想为Eclipse创建一个插件。问题是,我查看了API和示例,并设法在主栏上创建了一个带有特定图标的按钮,当我单击它时,打开一个InputDialog。

困难的部分是,我想从这个按钮启动一个应用程序,但不是Runtime,因为它是一个新进程。我只是想在插件中启动一个类,它将登录到服务器并从中获取一些输出。我希望它可以在控制台中打开,比如启动普通应用程序或单独的控制台。

此类最好的示例是启动Tomcat的Tomcat插件,然后将控制台输出到Eclipse控制台。我也想这样做。我看过Tomcat源代码插件,但我也被困在那里了。他们使用自己的发射器。

2 个答案:

答案 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());
}