akourt
akourt

Reputation: 5563

Applying Gradle plugin from local file

I have the following gradle plugin that does the job of starting up a java process. The code for this lives under a file named startAppServerPlugin.gradle under the project's buildSrc directory.

The code of the plugin looks like this:

    repositories.jcenter()
    dependencies {
        localGroovy()
        gradleApi()
    }
}

public class StartAppServer implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.task('startServer', type: StartServerTask)
    }
}

public class StartServerTask extends DefaultTask {

    String command
    String ready
    String directory = '.'

    StartServerTask(){
        description = "Spawn a new server process in the background."
    }

    @TaskAction
    void spawn(){
        if(!(command && ready)) {
            throw new GradleException("Ensure that mandatory fields command and ready are set.")
        }

        Process process = buildProcess(directory, command)
        waitFor(process)
    }

    private waitFor(Process process) {
        def line
        def reader = new BufferedReader(new InputStreamReader(process.getInputStream()))
        while ((line = reader.readLine()) != null) {
            logger.quiet line
            if (line.contains(ready)) {
                logger.quiet "$command is ready."
                break
            }
        }
    }

    private static Process buildProcess(String directory, String command) {
        def builder = new ProcessBuilder(command.split(' '))
        builder.redirectErrorStream(true)
        builder.directory(new File(directory))
        def process = builder.start()
        process
    }

}

I'm trying to figure out a way of having this imported into my main build.gradle file due everything I tried so far has been unsuccessful.

So far I have tried this:

apply from: 'startAppServerPlugin.gradle'
apply plugin: 'fts.gradle.plugins'

But it has been failing. I've tried searching online for examples of doing what I need to do but so far I've been unsuccessful. Can anyone please provide a hint as to how I'm supposed to do so?

Upvotes: 4

Views: 6913

Answers (3)

Feng Fan
Feng Fan

Reputation: 1

inside the startAppServerPlugin.gradle script you can call

    apply plugin: StartAppServer

Upvotes: 0

smac89
smac89

Reputation: 43078

You are on the right path. The first order of business is to import the external gradle build using:

apply from: 'startAppServerPlugin.gradle'

Then you can apply the plugin with:

apply plugin: StartAppServer

See Script Plugins and Applying Binary Plugins

Upvotes: 2

Bj&#248;rn Vester
Bj&#248;rn Vester

Reputation: 7600

The buildSrc folder is treated as an included build, where the code is compiled and put on the classpath of the surrounding project. The actual build.gradle file in buildSrc is only used for compiling that project, and the things you put in it will not be available elsewhere.

You are supposed to create your classes as a normal Java/Groovy/Kotlin project under buildSrc. I don't know if you can use the default package, but it is generally best practice to have a package name anyway.

For example, your StartAppServer plugin should be in buildSrc/src/main/groovy/my/package/StartAppServer.groovy. Then you can apply it in your build scripts with apply plugin: my.package.StartAppServer.

There are a lot of good examples in the user guide.

Upvotes: 1

Related Questions