All Downloads are FREE. Search and download functionalities are using the official Maven repository.

li.rudin.mavenjs.plugin.OptimzeMojo Maven / Gradle / Ivy

package li.rudin.mavenjs.plugin;

import static org.twdata.maven.mojoexecutor.MojoExecutor.artifactId;
import static org.twdata.maven.mojoexecutor.MojoExecutor.configuration;
import static org.twdata.maven.mojoexecutor.MojoExecutor.element;
import static org.twdata.maven.mojoexecutor.MojoExecutor.executeMojo;
import static org.twdata.maven.mojoexecutor.MojoExecutor.executionEnvironment;
import static org.twdata.maven.mojoexecutor.MojoExecutor.goal;
import static org.twdata.maven.mojoexecutor.MojoExecutor.groupId;
import static org.twdata.maven.mojoexecutor.MojoExecutor.name;
import static org.twdata.maven.mojoexecutor.MojoExecutor.plugin;
import static org.twdata.maven.mojoexecutor.MojoExecutor.version;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import li.rudin.mavenjs.plugin.config.CSSRequireJSConfig;
import li.rudin.mavenjs.plugin.config.RequireJSConfig;
import li.rudin.mavenjs.plugin.util.DirCopyVisitor;

import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.BuildPluginManager;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProject;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

@Mojo(requiresDependencyResolution=ResolutionScope.TEST, defaultPhase=LifecyclePhase.PREPARE_PACKAGE, name="optimize")
public class OptimzeMojo extends AbstractMojo
{

	@Parameter(defaultValue="${project.build.directory}/mavenjs/js/main.js") String jsOutput;
	@Parameter(defaultValue="${project.build.directory}/mavenjs/css/style.css") String cssOutput;

	@Parameter(defaultValue="${project.build.directory}/mavenjs_optimize_js.js") String jsConfigFile;
	@Parameter(defaultValue="${project.build.directory}/mavenjs_optimize_css.js") String cssConfigFile;

	/**
	 * compiled webapp gets copied here
	 */
	@Parameter(defaultValue="${project.build.directory}/classes") String webappOutput;

	/**
	 * Maven js build dir
	 */
	@Parameter(defaultValue="${project.build.directory}/mavenjs") String mavenjsBuildDir;

	@Parameter(defaultValue="${project}") MavenProject project;
	@Parameter(defaultValue="${session}") MavenSession session;
	@Component BuildPluginManager pluginManager;

	/**
	 * Json mapper
	 */
	private final ObjectMapper mapper = new ObjectMapper();

	@Override
	public void execute() throws MojoExecutionException, MojoFailureException
	{

		//https://github.com/TimMoore/mojo-executor

		Log logger = getLog();

		//Copy dependencies to target folder
		executeMojo(
				plugin(
						groupId("org.apache.maven.plugins"),
						artifactId("maven-dependency-plugin"),
						version("2.8")
						),
						goal("unpack-dependencies"),
						configuration(
								element(name("outputDirectory"), mavenjsBuildDir),
								element(name("excludes"), "**\\/*.class")
								),
								executionEnvironment(
										project,
										session,
										pluginManager
										)
				);
		try
		{
			//Copy main resources
			if (new File(project.getBuild().getOutputDirectory()).exists())
				Files.walkFileTree(Paths.get(project.getBuild().getOutputDirectory()), new DirCopyVisitor(Paths.get(mavenjsBuildDir), logger));

			//Copy test resources
			if (new File(project.getBuild().getTestOutputDirectory()).exists())
				Files.walkFileTree(Paths.get(project.getBuild().getTestOutputDirectory()), new DirCopyVisitor(Paths.get(mavenjsBuildDir), logger));

			//disable writing of null values
			mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);

			//Optimize javascript
			RequireJSConfig jsOptimizerConfig = new RequireJSConfig();
			jsOptimizerConfig.setOut(jsOutput);
			jsOptimizerConfig.setBaseUrl(mavenjsBuildDir + "/js");
			jsOptimizerConfig.getInclude().add("main");
			
			if (new File(mavenjsBuildDir + "/js/lib.js").exists())
				jsOptimizerConfig.setMainConfigFile(mavenjsBuildDir + "/js/lib.js");

			mapper.writeValue(new File(jsConfigFile), jsOptimizerConfig);

			//https://github.com/mcheely/requirejs-maven-plugin
			executeMojo(
					plugin(
							groupId("com.github.mcheely"),
							artifactId("requirejs-maven-plugin"),
							version("2.0.0")
							),
							goal("optimize"),
							configuration(
									element("configFile", jsConfigFile)
									),
									executionEnvironment(
											project,
											session,
											pluginManager
											)
					);

			if (new File(mavenjsBuildDir + "/css/style.css").exists())
			{
				//Optimize css
				CSSRequireJSConfig cssOptimizerConfig = new CSSRequireJSConfig();
				cssOptimizerConfig.setOut(cssOutput);
				cssOptimizerConfig.setCssIn(mavenjsBuildDir + "/css/style.css");

				mapper.writeValue(new File(cssConfigFile), cssOptimizerConfig);

				//https://github.com/mcheely/requirejs-maven-plugin
				executeMojo(
						plugin(
								groupId("com.github.mcheely"),
								artifactId("requirejs-maven-plugin"),
								version("2.0.0")
								),
								goal("optimize"),
								configuration(
										element("configFile", cssConfigFile)
										),
										executionEnvironment(
												project,
												session,
												pluginManager
												)
						);
			}
			
			//Copy back optimized content
			Files.walkFileTree(Paths.get(mavenjsBuildDir), new DirCopyVisitor(Paths.get(webappOutput), logger));
		}
		catch (IOException e)
		{
			logger.error(e);
			throw new MojoFailureException("optimize", e);
		}



	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy