作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 Eclipse 插件中运行 Ant 构建脚本。我还想通过在 Eclipse 控制台中显示 Ant 输出来向用户显示它。最后,我还想等待 Ant 构建完成,并捕获结果:构建成功还是失败?
我发现了三种从 eclipse 运行 Ant 脚本的方法:
org.eclipse.ant.core.AntRunner
,调用一些 setter 并调用 run()
或 run(IProgressMonitor)
。结果要么是正常终止(表示成功),要么是带有包含 BuildException
的 IStatus
的 CoreException(表示失败),或者是其他错误。但是,我在任何地方都看不到 Ant 输出。org.eclipse.ant.core.AntRunner
并调用 run(Object)
,传递包含命令的 String[]
行参数。结果要么是正常终止(指示成功),要么是 InitationTargetException
(指示失败),或者是其他错误。 Ant 输出似乎被发送到 Eclipse 的 stdout;它在 Eclipse 本身中不可见。DebugPlugin.getDefault().getLaunchManager()
,然后调用 getLaunchConfigurationType(IAntLaunchConfigurationConstants.ID_ANT_BUILDER_LAUNCH_CONFIGURATION_TYPE)
,然后调用该设置属性 "org. eclipse.ui.externaltools.ATTR_LOCATION"
添加到构建文件名(并将属性 DebugPlugin.ATTR_CAPTURE_OUTPUT
设置为 true),最后调用 launch()
。 Ant 输出显示在 Eclipse 控制台中,但我不知道如何在代码中捕获构建结果(成功/失败)。或者甚至如何等待启动终止。有没有办法让控制台输出和都捕获结果?
最佳答案
编辑 05/16/2016 @Lii 提醒我,ILaunchConfigurationWorkingCopy#launch
调用与 IStreamListener
之间的任何输出附加的将会丢失。他对这个答案做出了贡献here .
原始答案我意识到这是一篇旧文章,但我能够在我的一个插件中完全按照您的要求进行操作。如果此时它对您没有帮助,也许对其他人会有帮助。我最初是在 3.2 中这样做的,但它已针对 3.6 API 更改进行了更新...
// show the console
final IWorkbenchPage activePage = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow()
.getActivePage();
activePage.showView(IConsoleConstants.ID_CONSOLE_VIEW);
// let launch manager handle ant script so output is directed to Console view
final ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
ILaunchConfigurationType type = manager.getLaunchConfigurationType(IAntLaunchConstants.ID_ANT_LAUNCH_CONFIGURATION_TYPE);
final ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(null, [*** GIVE YOUR LAUNCHER A NAME ***]);
workingCopy.setAttribute(ILaunchManager.ATTR_PRIVATE, true);
workingCopy.setAttribute(IExternalToolConstants.ATTR_LOCATION, [*** PATH TO ANT SCRIPT HERE ***]);
final ILaunch launch = workingCopy.launch(ILaunchManager.RUN_MODE, null);
// make sure the build doesnt fail
final boolean[] buildSucceeded = new boolean[] { true };
((AntProcess) launch.getProcesses()[0]).getStreamsProxy()
.getErrorStreamMonitor()
.addListener(new IStreamListener() {
@Override
public void streamAppended(String text, IStreamMonitor monitor) {
if (text.indexOf("BUILD FAILED") > -1) {
buildSucceeded[0] = false;
}
}
});
// wait for the launch (ant build) to complete
manager.addLaunchListener(new ILaunchesListener2() {
public void launchesTerminated(ILaunch[] launches) {
boolean patchSuccess = false;
try {
if (!buildSucceeded[0]) {
throw new Exception("Build FAILED!");
}
for (int i = 0; i < launches.length; i++) {
if (launches[i].equals(launch)
&& buildSucceeded[0]
&& !((IProgressMonitor) launches[i].getProcesses()[0]).isCanceled()) {
[*** DO YOUR THING... ***]
break;
}
}
} catch (Exception e) {
[*** DO YOUR THING... ***]
} finally {
// get rid of this listener
manager.removeLaunchListener(this);
[*** DO YOUR THING... ***]
}
}
public void launchesAdded(ILaunch[] launches) {
}
public void launchesChanged(ILaunch[] launches) {
}
public void launchesRemoved(ILaunch[] launches) {
}
});
关于eclipse - 如何从 Eclipse 插件运行 ant,将输出发送到 Eclipse 控制台,并捕获构建结果(成功/失败)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2364247/
我是一名优秀的程序员,十分优秀!