From c8b3cc78905b09fc5da86d884dfba36db9620bd6 Mon Sep 17 00:00:00 2001 From: Cedric Champeau Date: Wed, 22 Feb 2023 13:16:10 +0100 Subject: [PATCH] Fix reload of templates in dev mode The `run` task is considered a development mode, where the templates should be reloaded live. This means that the `run` task will not use the precompiled templates, but the source templates instead. The `test` task will also use precompiled templates, while the `jar` and `uberJar` tasks will also make sure to bundle precompiled templates and not the source ones. --- .../com/uwyn/rife2/gradle/Rife2Plugin.java | 71 ++++++++++++++----- 1 file changed, 54 insertions(+), 17 deletions(-) diff --git a/build-logic/src/main/java/com/uwyn/rife2/gradle/Rife2Plugin.java b/build-logic/src/main/java/com/uwyn/rife2/gradle/Rife2Plugin.java index 19b6cec..ec85119 100644 --- a/build-logic/src/main/java/com/uwyn/rife2/gradle/Rife2Plugin.java +++ b/build-logic/src/main/java/com/uwyn/rife2/gradle/Rife2Plugin.java @@ -28,38 +28,83 @@ import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.plugins.PluginContainer; import org.gradle.api.tasks.JavaExec; import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.TaskContainer; import org.gradle.api.tasks.TaskProvider; import org.gradle.api.tasks.bundling.Jar; import org.gradle.api.tasks.testing.Test; import org.gradle.process.CommandLineArgumentProvider; import java.util.Collections; -import java.util.stream.Collectors; +import java.util.Locale; public class Rife2Plugin implements Plugin { + + public static final String DEFAULT_TEMPLATES_DIR = "src/main/templates"; + public static final String DEFAULT_GENERATED_RIFE2_CLASSES_DIR = "generated/classes/rife2"; + public static final String WEBAPP_SRCDIR = "src/main/webapp"; + @Override public void apply(Project project) { var plugins = project.getPlugins(); plugins.apply("java"); var javaPluginExtension = project.getExtensions().getByType(JavaPluginExtension.class); - var rife2Extension = createRife2Extension(project, javaPluginExtension); + var rife2Extension = createRife2Extension(project); var configurations = project.getConfigurations(); var dependencyHandler = project.getDependencies(); + var tasks = project.getTasks(); var rife2Configuration = createRife2Configuration(configurations, dependencyHandler, rife2Extension); var rife2CompilerClasspath = createRife2CompilerClasspathConfiguration(configurations, rife2Configuration); var rife2AgentClasspath = createRife2AgentConfiguration(configurations, dependencyHandler, rife2Extension); configurations.getByName(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME).extendsFrom(rife2Configuration); var precompileTemplates = registerPrecompileTemplateTask(project, rife2CompilerClasspath); - addTemplatesToMainOutput(precompileTemplates, javaPluginExtension); + createRife2DevelopmentOnlyConfiguration(project, configurations, dependencyHandler, precompileTemplates); + exposePrecompiledTemplatesToTestTask(project, configurations, dependencyHandler, precompileTemplates); configureAgent(project, plugins, rife2Extension, rife2AgentClasspath); - project.getTasks().register("uberJar", Jar.class, jar -> { + registerUberJarTask(project, plugins, javaPluginExtension, rife2Extension, tasks, precompileTemplates); + bundlePrecompiledTemplatesIntoJarFile(tasks, precompileTemplates); + } + + private static void exposePrecompiledTemplatesToTestTask(Project project, ConfigurationContainer configurations, DependencyHandler dependencyHandler, TaskProvider precompileTemplates) { + configurations.getByName(JavaPlugin.TEST_RUNTIME_ONLY_CONFIGURATION_NAME) + .getDependencies() + .add(dependencyHandler.create(project.files(precompileTemplates))); + } + + private static void bundlePrecompiledTemplatesIntoJarFile(TaskContainer tasks, TaskProvider precompileTemplates) { + tasks.named("jar", Jar.class, jar -> jar.from(precompileTemplates)); + } + + private void createRife2DevelopmentOnlyConfiguration(Project project, + ConfigurationContainer configurations, + DependencyHandler dependencies, + TaskProvider precompileTemplatesTask) { + Configuration rife2DevelopmentOnly = configurations.create("rife2DevelopmentOnly", conf -> { + conf.setDescription("Dependencies which should only be visible when running the application in development mode (and not in tests)."); + conf.setCanBeConsumed(false); + conf.setCanBeResolved(false); + }); + rife2DevelopmentOnly.getDependencies().add(dependencies.create(project.files(precompileTemplatesTask))); + configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME).extendsFrom(rife2DevelopmentOnly); + } + + private static void registerUberJarTask(Project project, + PluginContainer plugins, + JavaPluginExtension javaPluginExtension, + Rife2Extension rife2Extension, + TaskContainer tasks, + TaskProvider precompileTemplatesTask) { + tasks.register("uberJar", Jar.class, jar -> { var base = project.getExtensions().getByType(BasePluginExtension.class); jar.getArchiveBaseName().convention(project.provider(() -> base.getArchivesName().get() + "-uber")); jar.setDuplicatesStrategy(DuplicatesStrategy.EXCLUDE); - jar.into("webapp", spec -> spec.from("src/main/webapp")); var runtimeClasspath = project.getConfigurations().getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME); jar.from(javaPluginExtension.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME).getOutput()); - jar.from(runtimeClasspath.getElements().map(e -> e.stream().map(project::zipTree).collect(Collectors.toList()))); + jar.from(precompileTemplatesTask); + jar.into("webapp", spec -> spec.from(WEBAPP_SRCDIR)); + jar.from(runtimeClasspath.getElements().map(e -> e.stream() + .filter(f -> f.getAsFile().getName().toLowerCase(Locale.ENGLISH).endsWith(".jar")) + .map(project::zipTree) + .toList())); plugins.withId("application", unused -> jar.manifest(manifest -> manifest.getAttributes().put("Main-Class", rife2Extension.getUberMainClass().get())) ); @@ -77,7 +122,7 @@ public class Rife2Plugin implements Plugin { plugins.withId("application", unused -> project.getTasks().named("run", JavaExec.class, run -> run.getArgumentProviders().add(agentProvider))); } - private static Rife2Extension createRife2Extension(Project project, JavaPluginExtension javaPluginExtension) { + private static Rife2Extension createRife2Extension(Project project) { var rife2 = project.getExtensions().create("rife2", Rife2Extension.class); rife2.getUseAgent().convention(false); rife2.getUberMainClass().convention(project.getExtensions().getByType(JavaApplication.class).getMainClass() @@ -120,22 +165,14 @@ public class Rife2Plugin implements Plugin { return config; } - private static void addTemplatesToMainOutput(TaskProvider precompileTemplates, - JavaPluginExtension javaPluginExtension) { - javaPluginExtension.getSourceSets() - .getByName(SourceSet.MAIN_SOURCE_SET_NAME) - .getOutput() - .dir(precompileTemplates); - } - private static TaskProvider registerPrecompileTemplateTask(Project project, Configuration rife2CompilerClasspath) { return project.getTasks().register("precompileTemplates", PrecompileTemplates.class, task -> { task.getVerbose().convention(true); task.getClasspath().from(rife2CompilerClasspath); task.getType().convention("html"); - task.getTemplatesDirectory().set(project.getLayout().getProjectDirectory().dir("src/main/templates")); - task.getOutputDirectory().set(project.getLayout().getBuildDirectory().dir("generated/classes/rife2")); + task.getTemplatesDirectory().set(project.getLayout().getProjectDirectory().dir(DEFAULT_TEMPLATES_DIR)); + task.getOutputDirectory().set(project.getLayout().getBuildDirectory().dir(DEFAULT_GENERATED_RIFE2_CLASSES_DIR)); }); } }