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

com.excelsiorjet.maven.plugin.AbstractBuildMojo Maven / Gradle / Ivy

/*
 * Copyright (c) 2015-2017 Excelsior LLC.
 *
 *  This file is part of Excelsior JET Maven Plugin.
 *
 *  Excelsior JET Maven Plugin is free software:
 *  you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Excelsior JET Maven Plugin is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Excelsior JET Maven Plugin.
 *  If not, see .
 *
*/
package com.excelsiorjet.maven.plugin;

import com.excelsiorjet.api.tasks.JetBuildTask;
import com.excelsiorjet.api.tasks.JetProject;
import com.excelsiorjet.api.tasks.JetTaskFailureException;
import com.excelsiorjet.api.tasks.config.OSXAppBundleConfig;
import com.excelsiorjet.api.tasks.config.compiler.TrialVersionConfig;
import com.excelsiorjet.api.tasks.config.compiler.WindowsVersionInfoConfig;
import com.excelsiorjet.api.tasks.config.dependencies.DependencySettings;
import com.excelsiorjet.api.tasks.config.excelsiorinstaller.ExcelsiorInstallerConfig;
import com.excelsiorjet.api.tasks.config.runtime.RuntimeConfig;
import com.excelsiorjet.api.tasks.config.runtime.SlimDownConfig;
import com.excelsiorjet.api.tasks.config.windowsservice.WindowsServiceConfig;
import com.excelsiorjet.api.util.Utils;
import org.apache.maven.plugins.annotations.*;

import java.io.File;

import static com.excelsiorjet.api.log.Log.logger;
import static com.excelsiorjet.api.util.Txt.s;

/**
 * Parent Mojo that collects parameters for building Java (JVM) applications with Excelsior JET.
 *
 * @author Nikita Lipsky
 */
public abstract class AbstractBuildMojo extends AbstractJetMojo {

    /**
     * Target executable name. If not set, the main class name is used.
     */
    @Parameter(property = "outputName")
    protected String outputName;

    /**
     * (Windows) .ico file to associate with the resulting executable file.
     *
     * Default value is "icon.ico" of {@link #jetResourcesDir} directory.
     */
    @Parameter(property = "icon")
    protected File icon;

    /**
     * Splash image to display upon application start up.
     *
     * By default, the file "splash.png" from the {@link #jetResourcesDir} folder is used.
     * If it does not exist, but a splash image is specified in the manifest
     * of the application JAR file, that image will be used automatically.
     */
    @Parameter(property = "splash")
    protected File splash;

    /**
     * The JET Runtime supports three modes of stack trace printing: {@code minimal}, {@code full}, and {@code none}.
     * 

* In the {@code minimal} mode (default), line numbers and names of some methods are omitted in call stack entries, * but the class names are exact. *

*

* In the {@code full} mode, the stack trace info includes all line numbers and method names. * However, enabling the full stack trace has a side effect - substantial growth of the resulting * executable size, approximately by 30%. *

*

* In the {@code none} mode, Throwable.printStackTrace() methods print a few fake elements. * It may result in performance improvement if the application throws and catches exceptions repeatedly. * Note, however, that some third-party APIs may rely on stack trace printing. One example * is the Log4J API that provides logging services. *

*/ @Parameter(property = "stackTraceSupport") protected String stackTraceSupport; /** * Controls the aggressiveness of method inlining. * Available values are: * {@code aggressive} (default), {@code very-aggressive}, {@code medium}, {@code low}, {@code tiny-methods-only}. *

* If you need to reduce the size of the executable, * set the {@code low} or {@code tiny-methods-only} option. Note that it does not necessarily worsen application performance. *

*/ @Parameter(property = "inlineExpansion") protected String inlineExpansion; /** * Allocate on the stack the Java objects that do not escape the scope * of the allocating method. By default, the parameter is set to {@code true}. * * This optimization may increase the consumption of stack memory * by application threads, so you may wish to disable it if your application runs * thousands of threads simultaneously. */ @Parameter(property = "stackAllocation", defaultValue = "true") protected boolean stackAllocation; /** * (Windows) If set to {@code true}, the resulting executable file will not have a console upon startup. */ @Parameter(property = "hideConsole") protected boolean hideConsole; /** * Optimization presets define the default optimization mode for application dependencies. * There are two optimization presets available: {@code typical} and {@code smart}. * *
*
{@code typical} (default)
*
* Compile all classes from all dependencies to optimized native code. *
*
{@code smart}
*
* Use heuristics to determine which of the project dependencies are libraries and * compile them selectively, leaving the supposedly unused classes in bytecode form. *
*
*

* For details, refer to the Excelsior JET User's Guide, Chapter "JET Control Panel", * section "Step 3: Selecing a compilation mode / Classpath Grid / Selective Optimization". *

*

* Note: Unlike the identically named preset of the JET Control Panal, * selecting the {@code smart} preset does NOT automatically enable the Global Optimizer. *

* * @see #dependencies * @see DependencySettings * @see #globalOptimizer */ @Parameter(property = "optimizationPreset", defaultValue = "typical") protected String optimizationPreset; /** * If set to {@code true}, the Global Optimizer is enabled, * providing higher performance and lower memory usage for the compiled application. * Performing a Test Run is mandatory when the Global Optimizer is enabled. * The Global Optimizer is enabled automatically when you enable Java Runtime Slim-Down. * * @see TestRunMojo * @see #javaRuntimeSlimDown */ @Parameter(property = "globalOptimizer") protected boolean globalOptimizer; /** * Runtime configuration parameters. * * @see RuntimeConfig#flavor * @see RuntimeConfig#profile * @see RuntimeConfig#components * @see RuntimeConfig#locales * @see RuntimeConfig#diskFootprintReduction * @see RuntimeConfig#location */ @Parameter(property = "runtimeConfiguration", alias = "runtime") protected RuntimeConfig runtimeConfiguration; /** * Deprecated. Use {@link RuntimeConfig#profile} of {@link #runtimeConfiguration} parameter instead. */ @Deprecated @Parameter(property = "profile") private String profile; /** * Deprecated. Use {@link RuntimeConfig#components} of {@link #runtimeConfiguration} parameter instead. */ @Deprecated @Parameter(property = "optRtFiles") private String[] optRtFiles; /** * Deprecated. Use {@link RuntimeConfig#locales} of {@link #runtimeConfiguration} parameter instead. */ @Deprecated @Parameter(property = "locales") private String[] locales; /** * Deprecated. Use {@link RuntimeConfig#slimDown} of {@link #runtimeConfiguration} parameter instead. */ @Deprecated @Parameter(property = "javaRuntimeSlimDown") private SlimDownConfig javaRuntimeSlimDown; /** * If set to {@code true}, the multi-app mode is enabled for the resulting executable * (it mimicks the command line syntax of the conventional {@code java} launcher). */ @Parameter(property = "multiApp", defaultValue = "false") protected boolean multiApp; /** * If set to {@code true}, enables protection of application data - reflection information, * string literals, and resource files packed into the executable, if any. * * @see #cryptSeed */ @Parameter(property = "protectData") protected boolean protectData; /** * Sets a seed string that will be used by the Excelsior JET compiler to generate a key for * scrambling the data that the executable contains. * If data protection is enabled, but {@code cryptSeed} is not set explicitly, a random value is used. *

* You may want to set a {@code cryptSeed} value if you need the data to be protected in a stable way. *

* * @see #protectData */ @Parameter(property = "cryptSeed") protected String cryptSeed; /** * Enable/disable startup accelerator. * If enabled, the compiled application will run after build * for {@link #profileStartupTimeout} seconds for collecting a startup profile. */ @Parameter(property = "profileStartup", defaultValue = "true") protected boolean profileStartup; /** * The duration of the after-build profiling session in seconds. Upon exhaustion, * the application will be automatically terminated. */ @Parameter(property = "profileStartupTimeout", defaultValue = "20") protected int profileStartupTimeout; /** * Trial version configuration parameters. * * @see TrialVersionConfig#expireInDays * @see TrialVersionConfig#expireDate * @see TrialVersionConfig#expireMessage */ @Parameter(property = "trialVersion") protected TrialVersionConfig trialVersion; /** * Application packaging mode. Permitted values are: *
*
zip
*
zip archive with a self-contained application package (default)
*
excelsior-installer
*
self-extracting installer with standard GUI for Windows * and command-line interface for Linux
*
osx-app-bundle
*
OS X application bundle
*
native-bundle
*
Excelsior Installer setups for Windows and Linux, application bundle for OS X
*
none
*
skip packaging altogether
*
*/ @Parameter(property = "packaging") protected String packaging; /** * Application vendor name. Required for Windows version-information resource and Excelsior Installer. * By default, {@code ${project.organization.name}} is used. * If it is not set, the second part of the POM {@code groupId} identifier is used, with first letter capitalized. */ @Parameter(property = "vendor", defaultValue = "${project.organization.name}") protected String vendor; /** * Product name. Required for Windows version-information resource and Excelsior Installer. * By default, {@code ${project.oname}} is used. * If it is not set, the POM's artifactId identifier is used. */ @Parameter(property = "product", defaultValue = "${project.name}") protected String product; /** * Product version. Required for Excelsior Installer. * Note: To specify a different (more precise) version number for the Windows executable version-information resource, * use the {@link #windowsVersionInfoConfiguration} Mojo parameter. */ @Parameter(property = "version", defaultValue = "${project.version}") protected String version; /** * (Windows) If set to {@code true}, a version-information resource will be added to the final executable. * * @see #windowsVersionInfoConfiguration * @see WindowsVersionInfoConfig#company * @see WindowsVersionInfoConfig#product * @see WindowsVersionInfoConfig#version * @see WindowsVersionInfoConfig#copyright * @see WindowsVersionInfoConfig#description */ @Parameter(property = "addWindowsVersionInfo") protected Boolean addWindowsVersionInfo; /** * Windows version-information resource description. */ @Parameter(property = "windowsVersionInfoConfiguration", alias = "windowsVersionInfo") protected WindowsVersionInfoConfig windowsVersionInfoConfiguration; /** * Deprecated. Use {@link #windowsVersionInfoConfiguration} parameter instead. */ @Deprecated @Parameter(property = "winVIVersion") private String winVIVersion; /** * Deprecated. Use {@link #windowsVersionInfoConfiguration} parameter instead. */ @Deprecated @Parameter(property = "winVICopyright") private String winVICopyright; /** * Deprecated. Use {@link #windowsVersionInfoConfiguration} parameter instead. */ @Deprecated @Parameter(property = "winVIDescription") private String winVIDescription; /** * Excelsior Installer configuration parameters. * * @see ExcelsiorInstallerConfig#eula * @see ExcelsiorInstallerConfig#eulaEncoding * @see ExcelsiorInstallerConfig#installerSplash */ @Parameter(property = "excelsiorInstallerConfiguration", alias = "excelsiorInstaller") protected ExcelsiorInstallerConfig excelsiorInstallerConfiguration; /** * Windows Service configuration parameters. * * @see WindowsServiceConfig#name * @see WindowsServiceConfig#displayName * @see WindowsServiceConfig#description * @see WindowsServiceConfig#arguments * @see WindowsServiceConfig#logOnType * @see WindowsServiceConfig#allowDesktopInteraction * @see WindowsServiceConfig#startupType * @see WindowsServiceConfig#startServiceAfterInstall * @see WindowsServiceConfig#dependencies */ @Parameter(property = "windowsServiceConfiguration", alias = "windowsService") protected WindowsServiceConfig windowsServiceConfiguration; /** * OS X Application Bundle configuration parameters. * * @see OSXAppBundleConfig#fileName * @see OSXAppBundleConfig#bundleName * @see OSXAppBundleConfig#identifier * @see OSXAppBundleConfig#shortVersion * @see OSXAppBundleConfig#icon * @see OSXAppBundleConfig#developerId * @see OSXAppBundleConfig#publisherId */ @Parameter(property = "osxBundleConfiguration", alias = "osxBundle") protected OSXAppBundleConfig osxBundleConfiguration; /** * Additional compiler options and equations. * The commonly used compiler options and equations are mapped to the respective project parameters, * so usually there is no need to specify them with this parameter. * However, the compiler also has some advanced options and equations * that you may find in the Excelsior JET User's Guide, plus some troubleshooting settings * that the Excelsior JET Support team may suggest to you. * You may enumerate such options and equations with this parameter and they will be appended to the * Excelsior JET project generated by {@link JetBuildTask}. *

* Care must be taken when using this parameter to avoid conflicts with other project parameters. *

*/ @Parameter(property = "compilerOptions") protected String[] compilerOptions; /** * Command-line parameters for multi-app executables. If set, overrides the {@link #runArgs} parameter. *

] * If you set {@link #multiApp} to {@code true}, the resulting executable expects its command line * arguments to be in the respective format: *

* {@code [VM-options] main-class [arguments]} or
* {@code [VM-options] -args [arguments]} (use default main class) *

*

* So if you need to alter the main class and/or VM properties during startup profiling, * execution profiling, or normal run, set this parameter. *

*

* You may also set the parameter via the {@code jet.multiAppRunArgs} system property, where arguments * are comma separated (use "\" to escape commas inside arguments, * i.e. {@code -Djet.multiAppRunArgs="-args,arg1,Hello\, World"} will be passed to your application * as {@code -args arg1 "Hello, World"}) *

*/ @Parameter(property = "multiAppRunArgs") protected String[] multiAppRunArgs; @Override protected JetProject getJetProject() throws JetTaskFailureException { checkDeprecated(); return super.getJetProject().addWindowsVersionInfo(addWindowsVersionInfo) .excelsiorJetPackaging(packaging) .vendor(vendor) .product(product) .windowsVersionInfoConfiguration(windowsVersionInfoConfiguration) .inceptionYear(project.getInceptionYear()) .optimizationPreset(optimizationPreset) .globalOptimizer(globalOptimizer) .runtimeConfiguration(runtimeConfiguration) .trialVersion(trialVersion) .excelsiorInstallerConfiguration(excelsiorInstallerConfiguration) .windowsServiceConfiguration(windowsServiceConfiguration) .version(version) .osxBundleConfiguration(osxBundleConfiguration) .outputName(outputName) .multiApp(multiApp) .profileStartup(profileStartup) .protectData(protectData) .cryptSeed(cryptSeed) .icon(icon) .splash(splash) .stackTraceSupport(stackTraceSupport) .inlineExpansion(inlineExpansion) .stackAllocation(stackAllocation) .hideConsole(hideConsole) .profileStartupTimeout(profileStartupTimeout) .compilerOptions(compilerOptions) .multiAppRunArgs(multiAppRunArgs); } private void checkDeprecated() { if (winVIVersion != null) { logger.warn(s("JetBuildTask.WinVIDeprecated.Warning", "winVIVersion", "version")); if (windowsVersionInfoConfiguration.version == null) { windowsVersionInfoConfiguration.version = winVIVersion; } } if (winVICopyright != null) { logger.warn(s("JetBuildTask.WinVIDeprecated.Warning", "winVICopyright", "copyright")); if (windowsVersionInfoConfiguration.copyright == null) { windowsVersionInfoConfiguration.copyright = winVICopyright; } } if (winVIDescription != null) { logger.warn(s("JetBuildTask.WinVIDeprecated.Warning", "winVIDescription", "description")); if (windowsVersionInfoConfiguration.description == null) { windowsVersionInfoConfiguration.description = winVIDescription; } } if (!Utils.isEmpty(optRtFiles)) { logger.warn(s("JetBuildTask.RTSettingDeprecated.Warning", "optRtFiles", "components")); if (Utils.isEmpty(runtimeConfiguration.components)) { runtimeConfiguration.components = optRtFiles; } } if (!Utils.isEmpty(locales)) { logger.warn(s("JetBuildTask.RTSettingDeprecated.Warning", "locales", "locales")); if (Utils.isEmpty(runtimeConfiguration.locales)) { runtimeConfiguration.locales = locales; } } if (javaRuntimeSlimDown.isDefined()) { logger.warn(s("JetBuildTask.RTSettingDeprecated.Warning", "javaRuntimeSlimDown", "slimDown")); if (!runtimeConfiguration.slimDown.isDefined()) { runtimeConfiguration.slimDown = javaRuntimeSlimDown; } } if (profile != null) { logger.warn(s("JetBuildTask.RTSettingDeprecated.Warning", "profile", "profile")); if (runtimeConfiguration.profile == null) { runtimeConfiguration.profile = profile; } } if (execProfilesDir !=null) { logger.warn(s("JetBuildTask.ExecProfilesDeprecated.Warning", "execProfilesDir", "outputDir")); if (execProfilesConfig.outputDir == null) { execProfilesConfig.outputDir = execProfilesDir; } } if (execProfilesName !=null) { logger.warn(s("JetBuildTask.ExecProfilesDeprecated.Warning", "execProfilesName", "outputName")); if (execProfilesConfig.outputName == null) { execProfilesConfig.outputName = execProfilesName; } } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy