Я сталкиваюсь со следующей загадкой, которую я потратил много времени, пытаясь решить безуспешно. У меня есть собственный плагин Gradle, задача которого - запустить процесс и запустить его в фоновом режиме.
Код моего кода плагина следующий:
public class TaskSpawnerPlugin implements Plugin<Project> {
void apply(Project project) {
project.task('spawnTask', type: TaskSpawner)
}
}
И это задача, о которой идет речь:
public class TaskSpawner extends DefaultTask {
@Input
String command
@Input
String ready
@Input
String workDir = '.'
TaskSpawner() {
description = 'Given a Unix like cmd, this will start it and let it run on the background'
}
@TaskAction
public void spawn() {
getLogger().quiet "Attempting to run provided command $command"
if (!(command && ready)) {
throw new GradleException("Please make sure that both the command and ready check are provided!")
}
waitFor(createProcess(workDir, command))
}
private def waitFor(Process process) {
new BufferedReader(new InputStreamReader(process.getInputStream())).withCloseable {
reader ->
def line
while ((line = reader.readLine()) != null) {
getLogger().quiet line
if (line.contains(ready)) {
getLogger().quiet "$command is ready"
break
}
}
}
}
private def static createProcess(String directory, String command) {
new ProcessBuilder(command.split(' '))
.redirectErrorStream(true)
.directory(Paths.get(directory).toFile())
.redirectError(ProcessBuilder.Redirect.INHERIT)
.redirectInput(ProcessBuilder.Redirect.INHERIT)
.redirectOutput(ProcessBuilder.Redirect.INHERIT)
.start()
}
}
Код находится в структуре пакета со следующим именем пакета
fts.gradle
Мой скрипт сборки выглядит следующим образом:
plugins {
id 'java-gradle-plugin'
id 'groovy'
id 'maven-publish'
}
group = 'fts.gradle'
version = '0.3'
repositories {
jcenter()
}
dependencies {
compile gradleApi()
compile localGroovy()
}
gradlePlugin {
plugins {
greetingsPlugin {
id = 'fts.gradle.taskspawn'
implementationClass = 'fts.gradle.TaskSpawnerPlugin'
}
}
}
Я обычно собираю свой плагин и размещаю его на локально размещенной артефакте. Моя проблема вращается вокруг того, как импортировать его и использовать в проекте.
В настоящее время я делаю следующее:
buildscript {
repositories {
maven { url "<maven_url>" }
}
dependencies {
classpath group: 'fts.gradle', name: 'task-spawner', version: '0.3'
}
}
plugins {
id 'java'
id 'application'
id 'eclipse'
}
apply plugin: 'fts.gradle'
И затем я пытаюсь применить его, используя следующее:
Но при попытке обновить проект это действие завершается неудачно:
* What went wrong:
A problem occurred evaluating project ':integration-tests'.
> Could not get unknown property 'TaskSpawner' for project ':integration-tests' of type org.gradle.api.Project.
Я прочитал документацию и перепробовал все различные способы создания и импорта плагина в качестве автономного jar, нопока что мне не удалось.
Может кто-нибудь, пожалуйста, пролить немного света здесь? В последние дни это сводило с ума.
Обратите внимание, для справки версия Gradle, которую я использую 5.6.2