MavenCli 输出到 eclipse/maven 控制台

MavenCli output to eclipse/maven console

我有一个 elipse RCP 应用程序,它使用 Maven Surefire 进行特殊测试。 Maven 通过 m2e 集成到应用程序中。

用户在我的应用程序中构建他的项目并想要测试他的项目的部分内容。

现在可以从我的代码中启动 maven 测试命令,它运行良好,但日志输出没有打印到我的应用程序的控制台,而是打印到我的 IDE 的控制台。

public class MyAction implements IObjectActionDelegate {

private IFolder selectedFolder;
private IPath path;

@Override
public void run(IAction action) {
    String flagValue = foo();
    String projectLocation = bar();

    PrintStream out = System.out; // <- here

    MavenCli cli = new MavenCli();
    cli.doMain(new String[] {"test", "-DmyFlag=" + flagValue}, 
            projectLocation, out, out);
}

如何让 mavenCli 打印到我的应用程序的控制台?

好的,我找到了一种从 MavenCLI 打印到应用程序控制台的方法。在由用户触发的操作中,我开始了一项工作:

public class MyAction implements IObjectActionDelegate {

private IFolder selectedFolder;
private IPath path;

@Override
public void run(IAction action) {
    String flagValue = foo();
    String projectLocation = bar();

    MyJob runTestCaseJob = new MyJob(flagValue , projectLocation);
        runTestCaseJob.schedule();
}

在作业中 class 我正在启动 MavenCLI:

public class MyJob extends Job {

private static final String TASK_NAME = "Starting the Maven Command";

private String myFlag;
private String projectLocation;

private final PrintStream out = getConsole();
private final MavenCli cli = new MavenCli();

public MyJob(String myFlag, String projectLocation) {
    super(TASK_NAME);
    this.myFlag = myFlag;
    this.projectLocation = projectLocation;
}

@Override
protected IStatus run(IProgressMonitor monitor) {
    cli.doMain(new String[] {"test", "-DmyFlag=" + myFlag}, 
            projectLocation, out, out);
    return Status.OK_STATUS;
}

private PrintStream getConsole() {
    MessageConsole console = findMessageConsole("Console");
    console.activate();
    return new PrintStream(console.newOutputStream());
}

private MessageConsole findMessageConsole(String title) {
    IConsole[] existingConsoles = ConsolePlugin.getDefault().getConsoleManager().getConsoles();
    for (IConsole existingConsole : existingConsoles) {
        if (existingConsole.getName().equals(title)) {
            return (MessageConsole) existingConsole;
        }
    }
    MessageConsole console = new MessageConsole(title, null);
    ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] {console});
    return console;
}