如何将buildSrc目录下的本地Gradle启动插件导入主build.gradle?
Alright, let's get your Gradle plugin up and running properly. The issue here is mostly about following Gradle's buildSrc conventions and fixing a few code structure mishaps. Here's a step-by-step breakdown to fix it:
1. Fix the buildSrc Directory Structure
Gradle expects buildSrc code to follow standard Groovy/Java project structure, not just a loose .gradle file in the root. First, rearrange your files like this:
buildSrc/ ├── build.gradle └── src/ └── main/ └── groovy/ └── fts/ └── gradle/ └── plugins/ └── StartAppServer.groovy
This package structure (fts.gradle.plugins) matches the plugin ID you tried to use earlier.
2. Move Build Dependencies to buildSrc/build.gradle
Your original plugin code included repository and dependency declarations—those belong in the build script for buildSrc itself, not the plugin class. Create buildSrc/build.gradle with this content:
repositories { jcenter() } dependencies { localGroovy() gradleApi() }
3. Clean Up the Plugin Class
Move your plugin code into StartAppServer.groovy (not a .gradle file), fix syntax issues, and add the proper package declaration:
package fts.gradle.plugins import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.DefaultTask import org.gradle.api.tasks.TaskAction import org.gradle.api.GradleException class StartAppServer implements Plugin<Project> { @Override void apply(Project project) { project.task('startServer', type: StartServerTask) } } 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 void waitFor(Process process) { def line def reader = new BufferedReader(new InputStreamReader(process.inputStream)) 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)) builder.start() } }
Key fixes here:
- Removed misplaced repository/dependency blocks
- Added proper package and imports
- Fixed escaped angle brackets (
<→<) - Added explicit return type for
waitFor(Groovy allows omitting it, but this makes the code clearer)
4. Apply the Plugin in Your Main build.gradle
Now you have two valid ways to apply the plugin:
Option A: Use the Plugin Class Directly
Since buildSrc code is automatically available to your project, you can reference the plugin class directly:
apply plugin: fts.gradle.plugins.StartAppServer
Option B: Use a Plugin ID (Recommended)
To use the fts.gradle.plugins ID you tried earlier, add a properties file to register the plugin:
- Create
buildSrc/src/main/resources/META-INF/gradle-plugins/fts.gradle.plugins.properties - Add this line to the file:
implementation-class=fts.gradle.plugins.StartAppServer - Now you can apply the plugin using the ID in your main
build.gradle:apply plugin: 'fts.gradle.plugins'
5. Configure the Task
Don't forget to set the mandatory command and ready properties for the startServer task in your main build.gradle:
startServer { command = "java -jar path/to/your/app.jar" ready = "Server started successfully" // Adjust this to match your server's ready message directory = "${project.rootDir}" // Or another directory if needed }
Verify It Works
Run ./gradlew tasks (or gradlew tasks on Windows) — you should see the startServer task listed under other tasks. Then run ./gradlew startServer to test it out.
内容的提问来源于stack exchange,提问作者vkourt

