Spring Boot を使うと、 Gradle のタスクとして bootrun
が追加されます。 それがどのようにして登録されているのかを追いかけてみました。
プラグイン追加時にタスクが追加される
bootrun
は、 Spring Boot を build.gradle
に記述することで使えるようになります。
apply plugin
で Spring Boot のプラグインを読み込むと SpringBootPlugin
の execute
が実行されます。 その中で、 JavaPluginAction
をプラグインとして追加しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
private void registerPluginActions(Project project, Configuration bootArchives) { SinglePublishedArtifact singlePublishedArtifact = new SinglePublishedArtifact( bootArchives.getArtifacts()); List<PluginApplicationAction> actions = Arrays.asList( new JavaPluginAction(singlePublishedArtifact), new WarPluginAction(singlePublishedArtifact), new MavenPluginAction(bootArchives.getUploadTaskName()), new DependencyManagementPluginAction(), new ApplicationPluginAction(), new KotlinPluginAction()); for (PluginApplicationAction action : actions) { Class<? extends Plugin<? extends Project>> pluginClass = action .getPluginClass(); if (pluginClass != null) { project.getPlugins().withType(pluginClass, (plugin) -> action.execute(project)); } } } |
他にも KotlinPluginAction
があり、 そこでは Kotlin の Gradle プラグイン を読み込んでいます。
JavaPluginAction
がプラグインとして読み込まれているので、 そのクラスの execute
が実行されます。 JavaPluginAction
は インターフェース PluginApplicationAction
を実装しています。
PluginApplicationAction
は Action<Project>
を継承したインターフェースで、 Action<Project>
にひとつメソッドが追加されたものです。
1 2 3 4 5 6 7 8 9 10 11 |
@Override public void execute(Project project) { disableJarTask(project); configureBuildTask(project); BootJar bootJar = configureBootJarTask(project); configureArtifactPublication(bootJar); configureBootRunTask(project); configureUtf8Encoding(project); configureParametersCompilerArg(project); configureAdditionalMetadataLocations(project); } |
この中の configureBootRunTask
で タスク bootrun
が追加されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
private void configureBootRunTask(Project project) { JavaPluginConvention javaConvention = project.getConvention() .getPlugin(JavaPluginConvention.class); BootRun run = project.getTasks().create("bootRun", BootRun.class); run.setDescription("Runs this project as a Spring Boot application."); run.setGroup(ApplicationPlugin.APPLICATION_GROUP); run.classpath(javaConvention.getSourceSets() .findByName(SourceSet.MAIN_SOURCE_SET_NAME).getRuntimeClasspath()); run.getConventionMapping().map("jvmArgs", () -> { if (project.hasProperty("applicationDefaultJvmArgs")) { return project.property("applicationDefaultJvmArgs"); } return Collections.emptyList(); }); run.conventionMapping("main", new MainClassConvention(project, run::getClasspath)); } |
BootRun の中身
bootrun
は、 通常 apply plugin: 'application'
で実行できるようになる gradle run
を Spring Boot 向けに ラップしたものです。 JavaExec
に追加されたコードはさほど多くありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/** * Custom {@link JavaExec} task for running a Spring Boot application. * * @author Andy Wilkinson * @since 2.0.0 */ public class BootRun extends JavaExec { /** * Adds the {@link SourceDirectorySet#getSrcDirs() source directories} of the given * {@code sourceSet's} {@link SourceSet#getResources() resources} to the start of the * classpath in place of the {@link SourceSet#getOutput output's} * {@link SourceSetOutput#getResourcesDir() resources directory}. * @param sourceSet the source set */ public void sourceResources(SourceSet sourceSet) { setClasspath(getProject() .files(sourceSet.getResources().getSrcDirs(), getClasspath()) .filter((file) -> !file.equals(sourceSet.getOutput().getResourcesDir()))); } @Override public void exec() { if (System.console() != null) { // Record that the console is available here for AnsiOutput to detect later this.getEnvironment().put("spring.output.ansi.console-available", true); } super.exec(); } } |