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

com.zenjava.javafx.maven.plugin.AbstractBundleMojo Maven / Gradle / Ivy

package com.zenjava.javafx.maven.plugin;

import com.zenjava.javafx.deploy.ApplicationProfile;
import com.zenjava.javafx.maven.plugin.util.JfxToolsWrapper;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Build;
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.project.MavenProject;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.StringUtils;

import java.io.File;
import java.io.IOException;
import java.util.Collection;

import static org.twdata.maven.mojoexecutor.MojoExecutor.*;

public abstract class AbstractBundleMojo extends AbstractMojo {

    /**
     * @parameter expression="${project.name}"
     * @required
     */
    protected String title;

    /**
     * @parameter expression="${project.organization.name}"
     * @required
     */
    protected String vendor;

    /**
     * @parameter expression="${project.description}"
     */
    protected String description;

    /**
     * @parameter expression="${project.organization.url}"
     */
    protected String homepage;

    /**
     * @parameter
     */
    protected File icon;

    /**
     * @parameter
     */
    protected File splashImage;

    /**
     * @parameter
     */
    protected boolean offlineAllowed;

    /**
     * @parameter
     */
    protected String[] permissions;

    /**
     * @parameter
     */
    protected String jreVersion;

    /**
     * @parameter
     */
    protected String jreArgs;

    /**
     * @parameter
     */
    protected String jfxVersion;

    /**
     * @parameter expression="${mainClass}"
     * @required
     */
    protected String mainClass;

    /**
     * @parameter expression="${java.home}"
     */
    protected String javaHome;

    /**
     * @parameter expression="${verbose}" default-value="false"
     */
    protected Boolean verbose;


    /**
     * @parameter
     */
    protected File keyStore;

    /**
     * @parameter
     */
    protected String keyStoreAlias;

    /**
     * @parameter
     */
    protected String keyStorePassword;

    /**
     * @parameter
     */
    protected String keyPassword;

    /**
     * @parameter default-value="jks"
     */
    protected String keyStoreType;


    /**
     * The Maven Project Object
     *
     * @parameter expression="${project}"
     * @required
     * @readonly
     */
    protected MavenProject project;

    /**
     * The Maven Session Object
     *
     * @parameter expression="${session}"
     * @required
     * @readonly
     */
    protected MavenSession session;

    /**
     * The Maven PluginManager Object
     *
     * @component
     * @required
     */
    protected BuildPluginManager pluginManager;



    protected ApplicationProfile getApplicationProfile() throws MojoExecutionException {

        ApplicationProfile appProfile = new ApplicationProfile();
        appProfile.setTitle(title);
        appProfile.setVendor(vendor);
        appProfile.setDescription(description);
        appProfile.setMainClass(mainClass);
        appProfile.setHomepage(homepage);

        File icon = this.icon;
        if (icon == null) {
            File file = new File(project.getBasedir(), "src/main/deploy/icon.png");
            if (file.exists()) {
                icon = file;
            }
        }
        if (icon != null) {
            getLog().debug("Using icon file at '" + icon + "'");
            appProfile.setIcon(icon.getName());
        }

        File splashImage = this.splashImage;
        if (splashImage == null) {
            File file = new File(project.getBasedir(), "src/main/deploy/splash.jpg");
            if (file.exists()) {
                splashImage = file;
            }
        }
        if (splashImage != null) {
            getLog().debug("Using splash image file at '" + splashImage + "'");
            appProfile.setSplashImage(splashImage.getName());
        }

        appProfile.setOfflineAllowed(offlineAllowed);

        if (jreVersion != null) {
            appProfile.setJreVersion(jreVersion);
        }

        if (jreArgs != null) {
            appProfile.setJreArgs(jreArgs);
        }

        if (jfxVersion != null) {
            appProfile.setJreVersion(jfxVersion);
        }

        if (permissions != null) {
            appProfile.setPermissions(permissions);
        }

        return appProfile;
    }

    protected void copyAllJarsAndUpdateProfile(File baseDir,
                                               String jarSubDir,
                                               ApplicationProfile appProfile)
            throws MojoExecutionException, MojoFailureException {

        File jarDir = baseDir;
        if (!StringUtils.isEmpty(jarSubDir)) {
            jarDir = new File(baseDir, jarSubDir);
        }
        copyAllJars(jarDir);
        updateApplicationProfileDependencies(baseDir, appProfile);
    }

    protected void copyAllJars(File targetDir) throws MojoExecutionException, MojoFailureException {

        getLog().debug("Building exploded bundle for JavaFX distributable to '" + targetDir + "'");

        getLog().info("Copying module dependencies to: '" + targetDir + "'");
        copyModuleDependencies(targetDir);

        Build build = project.getBuild();
        File jarFile = new File(build.getDirectory(), build.getFinalName() + ".jar");
        try {
            getLog().info("Copying module jar file to output directory: '" + jarFile + "' => '" + targetDir + "'");
            FileUtils.copyFileToDirectoryIfModified(jarFile, targetDir);
        } catch (IOException e) {
            throw new MojoExecutionException("Unable to copy module jar file to output directory: '"
                    + jarFile + "' => '" + targetDir + "'");
        }
    }

    protected File[] findJars(File baseDirectory) {

        Collection jars =  org.apache.commons.io.FileUtils.listFiles(baseDirectory, new String[] { "jar" }, true);
        return org.apache.commons.io.FileUtils.convertFileCollectionToFileArray(jars);
    }

    protected String[] findJarsRelative(File baseDirectory) throws MojoExecutionException {

        File[] jars = findJars(baseDirectory);
        String[] relativeJars = new String[jars.length];
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < jars.length; i++) {
            File jar = jars[i];
            builder.setLength(0);
            while (!jar.equals(baseDirectory)) {
                if (builder.length() > 0) {
                    builder.insert(0, "/");
                }
                builder.insert(0, jar.getName());
                jar = jar.getParentFile();
            }
            relativeJars[i] = builder.toString();
        }
        return relativeJars;
    }

    protected void updateApplicationProfileDependencies(File bundleDir, ApplicationProfile appProfile)
            throws MojoExecutionException {

        String[] jars = findJarsRelative(bundleDir);
        appProfile.setJarResources(jars);
    }

    protected void copyModuleDependencies(File targetDir) throws MojoExecutionException, MojoFailureException {

        executeMojo(
                plugin(
                        groupId("org.apache.maven.plugins"),
                        artifactId("maven-dependency-plugin"),
                        version("2.5.1")
                ),
                goal("copy-dependencies"),
                configuration(
                        element(name("outputDirectory"), targetDir.getPath())
                ),
                executionEnvironment(
                        project,
                        session,
                        pluginManager
                )
        );
    }

    public void signJarFiles(File directory) throws MojoExecutionException, MojoFailureException {

        getLog().info("Signing all JAR files in '" + directory + "'");

        if (keyStore == null) {
            keyStore = new File(project.getBasedir(), "/src/main/deploy/keystore.jks");
        }
        if (!keyStore.exists()) {
            throw new MojoFailureException("Keystore does not exist, use 'jfx:generate-key-store' command to make one (expected at: " + keyStore + ")");
        }

        if (StringUtils.isEmpty(keyStoreAlias)) {
            throw new MojoFailureException("A 'keyStoreAlias' is required for signing JARs");
        }

        if (StringUtils.isEmpty(keyStorePassword)) {
            throw new MojoFailureException("A 'keyStorePassword' is required for signing JARs");
        }

        if (keyPassword == null) {
            keyPassword = keyStorePassword;
        }

        JfxToolsWrapper jfxTools = getJfxToolsWrapper();
        File[] jarFiles = findJars(directory);
        jfxTools.signJarFiles(keyStore, keyStoreAlias, keyStorePassword, keyPassword, keyStoreType, jarFiles);
    }

    protected JfxToolsWrapper getJfxToolsWrapper() throws MojoFailureException, MojoExecutionException {

        getLog().info("Java home is: " + javaHome);
        File javaHomeDir = new File(javaHome);
        File jdkHomeDir = javaHomeDir.getParentFile();
        File jfxToolsJar = new File(jdkHomeDir, "lib/ant-javafx.jar");
        if (!jfxToolsJar.exists()) {
            throw new MojoFailureException("Unable to find JavaFX tools JAR file at '"
                    + jfxToolsJar + "'. Is your JAVA_HOME set to a JDK with JavaFX installed (must be Java 1.7.0 update 9 or higher)?");
        }
        return new JfxToolsWrapper(jfxToolsJar, verbose);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy