All Projects → fvarrui → Javapackager

fvarrui / Javapackager

Licence: gpl-3.0
📦 Gradle/Maven plugin to package Java applications as native Windows, Mac OS X, or GNU/Linux executables and create installers for them.

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to Javapackager

SetupBuilder
Gradle plugin for building setups for different platforms.
Stars: ✭ 75 (-73.68%)
Mutual labels:  gradle, installer, deb, rpm, gradle-plugin
Jib
🏗 Build container images for your Java applications.
Stars: ✭ 11,370 (+3889.47%)
Mutual labels:  gradle, gradle-plugin, maven-plugin, maven
Maven Git Versioning Extension
This extension will virtually set project versions, based on current git branch or tag.
Stars: ✭ 178 (-37.54%)
Mutual labels:  gradle, gradle-plugin, maven-plugin, maven
dmn-check
A tool which performs static analyses on Decision Model Notation (DMN) files to detect bugs
Stars: ✭ 34 (-88.07%)
Mutual labels:  maven, maven-plugin, gradle-plugin
Bnd
Bnd/Bndtools. Tooling to build OSGi bundles including Eclipse, Maven, and Gradle plugins.
Stars: ✭ 446 (+56.49%)
Mutual labels:  gradle, gradle-plugin, maven-plugin
rpm-builder
Maven RPM builder plugin
Stars: ✭ 46 (-83.86%)
Mutual labels:  maven, rpm, maven-plugin
RapidMavenPushPlugin
A Gradle plugin : Upload Artifacts to Multi Maven Repository
Stars: ✭ 21 (-92.63%)
Mutual labels:  maven, maven-plugin, gradle-plugin
gradle-git-versioning-plugin
This extension will set project version, based on current Git branch or tag.
Stars: ✭ 44 (-84.56%)
Mutual labels:  maven, maven-plugin, gradle-plugin
kobby
Kobby is a codegen plugin of Kotlin DSL Client by GraphQL schema. The generated DSL supports execution of complex GraphQL queries, mutation and subscriptions in Kotlin with syntax similar to native GraphQL syntax.
Stars: ✭ 52 (-81.75%)
Mutual labels:  maven, maven-plugin, gradle-plugin
native-build-tools
Native-image plugins for various build tools
Stars: ✭ 168 (-41.05%)
Mutual labels:  maven, maven-plugin, gradle-plugin
sonatype-publish-plugin
Gradle Plugin for publishing artifacts to Sonatype and Nexus
Stars: ✭ 17 (-94.04%)
Mutual labels:  gradle, maven, gradle-plugin
sign-maven-plugin
Maven plugin which creates Open PGP / GPG signatures for all of the project's artifacts
Stars: ✭ 34 (-88.07%)
Mutual labels:  maven, maven-plugin
Dependencycheck
OWASP dependency-check is a software composition analysis utility that detects publicly disclosed vulnerabilities in application dependencies.
Stars: ✭ 3,571 (+1152.98%)
Mutual labels:  gradle-plugin, maven-plugin
Gradle Code Quality Tools Plugin
Gradle plugin that generates ErrorProne, Findbugs, Checkstyle, PMD, CPD, Lint, Detekt & Ktlint Tasks for every subproject.
Stars: ✭ 282 (-1.05%)
Mutual labels:  gradle, gradle-plugin
gradle-console-reporter
Gradle plugin to report various kinds of summaries to console.
Stars: ✭ 49 (-82.81%)
Mutual labels:  gradle, gradle-plugin
plugin-yml
A Gradle plugin that generates plugin.yml for Bukkit/BungeeCord/Nukkit plugins based on the Gradle project
Stars: ✭ 42 (-85.26%)
Mutual labels:  gradle, gradle-plugin
jooq-plugin
Plugin for generating jOOQ classes using dockerized databases
Stars: ✭ 55 (-80.7%)
Mutual labels:  gradle, gradle-plugin
Jenkins Bootstrap Shared
Jenkins as immutable infrastructure made easy. A repository of shared scripts meant to be used as a git submodule. Packing Jenkins, plugins, and scripts into immutable packages and images.
Stars: ✭ 270 (-5.26%)
Mutual labels:  rpm, deb
Gradle Aws Plugin
Gradle plugin to manage Amazon Web Services
Stars: ✭ 269 (-5.61%)
Mutual labels:  gradle, gradle-plugin
broom
A disk cleaning utility for developers.
Stars: ✭ 38 (-86.67%)
Mutual labels:  gradle, maven

JavaPackager

Maven Central GPL-3.0

JavaPackager is a hybrid plugin for Maven and Gradle which provides an easy way to package Java applications in native Windows, Mac OS X or GNU/Linux executables, and generate installers for them.

SNAPSHOT version is not released to Maven Central, so you have to install it manually.

👀 See JavaPackager changes and fixes.

History

It was born while teaching to my students how to build and distribute their Java apps, and after seeing that a chain of several plugins was needed to achieve this task, I decided to develop a plugin 💍 to govern them all.

How to use this plugin

Package your app with Maven

Add the following plugin tag to your pom.xml:

<plugin>
	<groupId>io.github.fvarrui</groupId>
	<artifactId>javapackager</artifactId>
	<version>1.5.1</version>
	<executions>
		<execution>
			<phase>package</phase>
			<goals>
				<goal>package</goal>
			</goals>
			<configuration>
				<!-- mandatory -->
				<mainClass>path.to.your.mainClass</mainClass>
				<!-- optional -->
				<bundleJre>true|false</bundleJre>
				<generateInstaller>true|false</generateInstaller>
				<administratorRequired>true|false</administratorRequired>
				<platform>auto|linux|mac|windows</platform>
				<additionalResources>
					<additionalResource>file path</additionalResource>
					<additionalResource>folder path</additionalResource>
					<additionalResource>...</additionalResource>
				</additionalResources>
				<linuxConfig>...</linuxConfig>
				<macConfig>...</macConfig>
				<winConfig>...</winConfig>
				[...]
			</configuration>
		</execution>
	</executions>
</plugin>

See Maven plugin configuration samples to know more.

And execute the next command in project's root folder:

mvn package

Package your app with Gradle

Apply JavaPackager plugin in build.gradle using legacy mode (because at the moment it's only available in Maven Central repository):

buildscript {
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath 'io.github.fvarrui:javapackager:1.5.1'
	}
}

apply plugin: 'io.github.fvarrui.javapackager.plugin'

Create your packaging task:

task packageMyApp(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) {
	// mandatory
	mainClass = 'path.to.your.mainClass'
	// optional
	bundleJre = true|false
	generateInstaller = true|false
	administratorRequired = true|false
	platform = auto|linux|mac|windows
	additionalResources = [ file('file path'), file('folder path'), ... ]
	linuxConfig {
		...
	}
	macConfig {
		...
	}
	winConfig {
		...
	}
	...
}

See Gradle plugin configuration samples to know more.

And execute the next command in project's root folder:

gradle packageMyApp

Generated artifacts

By default it will generate next artifacts in ${outputDirectory} folder:

Artifact Description
${name} Directory with the native application and other needed assets.
${name}-${version}-runnable.jar Runnable JAR file.
${name}_${version}.deb DEB package file if it's executed on GNU/Linux (requires dpkg-deb).
${name}_${version}.rpm RPM package file if it's executed on GNU/Linux (requires rpmbuild).
${name}_${version}.exe Setup file if it's executed on Windows (requires Inno Setup).
${name}_${version}.msi MSI installer file if it's executed on Windows (requires WiX Toolset).
${name}_${version}.msm MSI merge module file if it's executed on Windows (requires WiX Toolset).
${name}_${version}.dmg Disk image file if it's executed on Mac OS X (requires hdiutil).
${name}_${version}.pkg PKG installer file if it's executed on Mac OS X (requires pkgbuild)
${name}-${version}-${platform}.zip Zipball containing generated directory ${name}.
${name}-${version}-${platform}.tar.gz Compressed tarball containing generated directory ${name}.

⚠️ Installers generation will be ommited if target platform is different from current platform (see platform property).

⚠️ DEB and RPM package generation in Gradle is not yet available. Coming soon!

Plugin configuration properties

Property Mandatory Default value Description
additionalModulePaths [] Additional module paths for jdeps.
additionalModules [] Additional modules to the ones identified by jdeps or the specified with modules property.
additionalResources [] Additional files and folders to include in the bundled app.
administratorRequired false App will run as administrator (with elevated privileges).
assetsDir ${basedir}/assets or ${projectdir}/assets Assets location (icons and custom Velocity templates).
bundleJre false Embeds a customized JRE with the app.
classpath List of additional paths to JVM classpath, separated with ; (recommended) or :.
copyDependencies true Bundles all dependencies (JAR files) with the app.
createTarball false Bundles app folder in tarball.
createZipball false Bundles app folder in zipball.
customizedJre true Generates a customized JRE, including only identified or specified modules. Otherwise, all modules will be included.
description ${project.description} or ${displayName} Project description.
displayName ${project.name} or ${name} App name to show.
envPath Defines PATH environment variable in GNU/Linux and Mac OS X startup scripts.
extra Map with extra properties to be used in customized Velocity templates, accesible through $info.extra variable.
generateInstaller true Generates an installer for the app.
iconFile Path to the app icon file (PNG, XPM, ICO or ICNS). ⚠️ Deprecated (see platform specific properties).
jdkPath ${java.home} JDK used to generate a customized JRE. It allows to bundle customized JREs for different platforms.
jreDirectoryName "jre" Bundled JRE directory name.
jreMinVersion JRE minimum version. If an appropriate version cannot be found display error message. Disabled if a JRE is bundled.
jrePath "" Path to JRE folder. If specified, it will bundle this JRE with the app, and won't generate a customized JRE. For Java 8 version or least.
licenseFile ${project.licenses[0].url} or ${basedir}/LICENSE or ${projectdir}/LICENSE Path to project license file.
mainClass ✔️ ${exec.mainClass} Full path to your app main class.
manifest Allows adding additional entries to MANIFEST.MF file.
modules [] Defines modules to customize the bundled JRE. Don't use jdeps to get module dependencies.
name ${project.name} or ${project.artifactId} App name.
organizationName ${project.organization.name} or "ACME" Organization name.
organizationUrl ${project.organization.url} Organization website URL.
organizationEmail Organization email.
outputDirectory ${project.build.directory} or ${project.builddir} Output directory (where the artifacts will be generated).
platform auto Defines the target platform, which could be different to the execution platform. Possible values: auto, mac, linux, windows. Use auto for using execution platform as target.
runnableJar Defines your own JAR file to be bundled. If it's ommited, the plugin packages your code in a runnable JAR and bundle it with the app.
url App website URL.
useResourcesAsWorkingDir true Uses app resources folder as default working directory (always true on Mac OS).
version ${project.version} Project version.
vmArgs [] Adds VM arguments.

Some default values depends on the used building tool.

Platform specific properties

Property Mandatory Default Description
linuxConfig GNU/Linux specific properties.
macConfig Mac OS X specific properties.
winConfig Windows specific properties.

⚠️ Be careful when using the platform property if your project uses platform dependent libraries, so the libraries of the current platform will be copied, not those required for the target platform. You can solve this problem using classifiers. Also, intallers generation will be ommited.

Plugin assets

Some assets, such as application icons and Velocity templates, could be placed in ${assetsDir} folder organized by platform.

${assetsDir}/
├── linux/
├── mac/
└── windows/

Icons

If icons are located in ${assetsDir} folders, it would not be necessary to specify the iconFile property:

${assetsDir}/
├── linux/
│   ├── ${name}.png     # on GNU/Linux it has to be a PNG file for DEB package
│   └── ${name}.xpm     # and XPM file for RPM package
├── mac/
│   └── ${name}.icns    # on Mac OS X it has to be a ICNS file
└── windows/
    └── ${name}.ico     # on Windows it has to be a ICO file

⚠️ If iconFile plugin property is not specified and it can't find the correct icon in ${assetsDir} folder, it will use an icon by default for all platforms.

Velocity templates

Velocity templates (.vtl files) are used to generate some artifacts which have to be bundled with the app.

It is possible to use your own customized templates. You just have to put one of the following templates in the ${assetsDir} folder organized by platform, and the plugin will use these templates instead of default ones:

${assetsDir}/
├── linux/
|   ├── assembly.xml.vtl               # maven-assembly-plugin template to generate ZIP/TGZ bundles for GNU/Linux
|   ├── control.vtl                    # DEB control template
|   ├── desktop.vtl                    # Desktop template
│   └── startup.sh.vtl                 # Startup script template
├── mac/
|   ├── assembly.xml.vtl               # maven-assembly-plugin template to generate ZIP/TGZ bundles for Mac OS X
|   ├── customize-dmg.applescript.vtl  # DMG customization Applescript template
|   ├── Info.plist.vtl                 # Info.plist template
│   └── startup.vtl                    # Startup script template
└── windows/
    ├── assembly.xml.vtl               # maven-assembly-plugin template to generate ZIP/TGZ bundles for Windows
    ├── exe.manifest.vtl               # exe.manifest template
    ├── iss.vtl                        # Inno Setup Script template
    ├── msm.wxs.vtl                    # WiX Toolset WXS template to generate Merge Module
    └── wxs.vtl                        # WiX Toolset WXS template to generate MSI

Use default templates as examples.

An object called info of type PackagerSettings is passed to all templates with all plugin properties.

Additional JVM options at runtime

When you build your app, all configuration details are hardcoded into the executable and cannot be changed without recreating it or hacking with a resource editor. JavaPackager introduces a feature that allows to pass additional JVM options at runtime from an .l4j.ini file (like Launch4j does, but available for all platforms in the same way). So, you can specify these options in the packager's configuration (packaging time), in INI file (runtime) or in both.

The INI file's name must correspond to ${name}.l4j.ini and it has to be located next to the executable on Windows and GNU/Linux, and in Resources folder on Mac OS X.

The options should be separated with spaces or new lines:

# Additional JVM options
-Dswing.aatext=true
-Dsomevar="%SOMEVAR%"
-Xms16m

How to build and install the plugin

Useful to try SNAPSHOT versions.

Execute next commands in BASH (GNU/Linux or macOS) or CMD (Windows):

  1. Download source code and change to the project directory:
git clone https://github.com/fvarrui/JavaPackager.git
cd JavaPackager
  1. Compile, package and install the plugin in your local repository (ommit ./ on Windows):
./gradlew publishToMavenLocal

How to release the plugin to Maven Central

Run next command (ommit ./ on Windows):

./gradlew -Prelease uploadArchives closeAndReleaseRepository

Related guide.

How to release the plugin to Gradle plugin portal

Only the first time, run next command:

./gradlew login

And then, run (ommit ./ on Windows):

./gradlew publishPlugins

Related guide.

Future features

Check the TO-DO list to know the features we plan to add to JavaPackager.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].