/**
* 执行任务
*
* @param rootProjectDir 根项目所在目录。
* @param subProjectName 子工程名称,如果子项目名称为空,则表示在整个工程中执行任务
* @param tasks 任务
* @return 执行结果
*/
public ExecuteResult execute(String rootProjectDir, String subProjectName, String... tasks) {
if (StringUtil.isBlank(rootProjectDir)) {
throw new IllegalArgumentException("根项目所在的目录不能为空!");
}
final File root = new File(rootProjectDir);
if (!root.exists()) {
throw new IllegalArgumentException("根项目所在的目录不存在!");
}
if (tasks == null) {
throw new IllegalArgumentException("没有可执行的任务!");
}
final List<String> arguments = new ArrayList<String>(1);
arguments.add("-xTest");
final Map<String, String> jvmDefines = new HashMap<String, String>();
final String[] taskes = tasks;
if (StringUtil.isNotBlank(subProjectName)) {
String sub = this.findSubProject(root, subProjectName);
if (StringUtil.isNotBlank(sub)) {
for (int i = 0; i < taskes.length; i++) {
taskes[i] = sub + ":" + tasks[i];
}
}
}
ExecutorService service = Executors.newSingleThreadExecutor();
Future<ExecuteResult> future = service.submit(new Callable<ExecuteResult>() {
@Override
public ExecuteResult call() throws Exception {
return execute(root, arguments, jvmDefines, taskes);
}
});
try {
while (!future.isDone()) {
// 等待结果
}
LOGGER.info("{}::执行【{}】完成。", rootProjectDir, Arrays.toString(tasks));
return future.get();
} catch (Exception e) {
LOGGER.error("任务执行失败。", e);
return new ExecuteResult(Result.FAIL, e);
} finally {
service.shutdown();
}
}
/**
* 执行Gradle命令
*
* @param projectDir 项目目录
* @param arguments 执行参数
* @param jvmDefines jvm参数
* @param tasks 任务
* @return 执行结果
*/
public ExecuteResult execute(File projectDir, List<String> arguments, Map<String, String> jvmDefines, String... tasks) {
ProjectConnection connection = gradleConnector.forProjectDirectory(projectDir).connect();
final CountDownLatch latch = new CountDownLatch(1);
final ExecuteResult ret = new ExecuteResult();
try {
BuildLauncher build = connection.newBuild().forTasks(tasks).withArguments(arguments.toArray(new String[arguments.size()]));
String[] jvmArgs = new String[jvmDefines.size()];
if (!jvmDefines.isEmpty()) {
int index = 0;
for (Map.Entry<String, String> entry : jvmDefines.entrySet()) {
jvmArgs[index++] = "-D" + entry.getKey() + "=" + entry.getValue();
}
}
build.setJvmArguments(jvmArgs);
build.addProgressListener(new ProgressListener() {
@Override
public void statusChanged(ProgressEvent event) {
LOGGER.info("execute gradle task status changed:" + event.getDescription());
}
});
build.run(new ResultHandler<Void>() {
@Override
public void onComplete(Void result) {
ret.setResult(Result.SUCCESS);
latch.countDown();
}
@Override
public void onFailure(GradleConnectionException exception) {
ret.setResult(Result.FAIL);
ret.setException(exception);
latch.countDown();
}
});
latch.await();
} catch (InterruptedException e) {
LOGGER.error("执行Gradle命令出错:" + e.getMessage(), e);
} finally {
connection.close();
}
return ret;
}