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