parcl

November 3, 2021 ยท View on GitHub

Build Status

Gradle plugin for bundling your Java application as Windows, Mac and Linux native applications

The plugin can generate the following platform natives:

  • Windows - .exe
  • Mac OS X - .app
  • Linux - .sh script

Future releases may add more native formats.

How to use

Add the following buildscript configuration to the top of your build.gradle

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        classpath group: 'org.mini2Dx', name: 'parcl', version: '1.8.0'
    }
}

Then add the plugin to your project, configuration for your main class and how you want parcl to bundle the application. The following shows the minimum required configuration.

project(":projectName") {
   apply plugin: "java"
   apply plugin: "application"
   apply plugin: "org.mini2Dx.parcl"
   
   ........

   mainClassName = "com.example.MyMainClass"

   parcl {
      exe {
         exeName = "myapplication"
      }
		
      app {
         appName = "My Application"
         icon = "relative/path/to/icon.icns"
         applicationCategory = "public.app-category.adventure-games"
         displayName = 'My Application'
         identifier = 'com.example.my.apple.identifier'
         copyright = 'Copyright 2015 Your Name Here'
      }
		
      linux {
         binName = "myapplication"
      }
   }
}

Note: If your version of Gradle gives an error regarding mainClassName, the following workaround has been reported to resolve it:

project(":projectName") {
   apply plugin: "java"
   apply plugin: "application"
   apply plugin: "org.mini2Dx.parcl"
   
   ........

   project.getConvention().getPlugin(ApplicationPluginConvention.class).setMainClassName("com.example.MyMainClass")

The plugin will add a task called 'bundleNative' to your project. This must be invoked on the platform you wish to bundle the application for, i.e. You must be on Mac OS X to bundle a Mac application.

gradle clean build bundleNative

Depending on your platform, the resulting application bundle will appear in build/windows, build/mac or build/linux.

Tasks

TaskDescription
bundleNativeGenerates the native application for the current platform
bundleNativeZipGenerates the native application and packages it into a .zip

Advanced Configuration

There are several optional configuration parameters for each platform.

Optional ParameterDescriptionExample
zipNameSpecifies the name for the outputted zip filezipName = 'my-game-windows.zip'
vmArgsPasses JVM options to the application on launchvmArgs = ["-Xmx1g"]
appArgsPasses application arguments to the application on launchappArgs = ["arg1", "arg2"]
withJreCopies your local JRE and bundles it with the application. The value of $JAVA_HOME must be passed as an argument.withJre("/usr/lib/jvm/java-8-oracle/")

The following example shows all options in use.

mainClassName = "com.example.MyMainClass"

parcl {
  exe {
    vmArgs = ["-Xmx1g"]
    appArgs = ["arg1", "arg2"]
    exeName = "myapplication"
    zipName = 'my-game-windows.zip'
			
    withJre("C:\\Program Files (x86)\\Java\\jdk1.8.0_25\\jre")
  }
		
  app {
    vmArgs = ["-Xmx1g"]
    appArgs = ["arg1", "arg2"]
    appName = "My Application"
    icon = "relative/path/to/icon.icns"
    applicationCategory = "public.app-category.adventure-games"
    displayName = 'My Application'
    identifier = 'com.example.my.apple.identifier'
    copyright = 'Copyright 2015 Your Name Here'
    zipName = 'my-game-mac.zip'

    withJre("/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home")
  }
		
  linux {
    vmArgs = ["-Xmx1g"]
    appArgs = ["arg1", "arg2"]
    binName = "myapplication"
    preferSystemJre = true
    zipName = 'my-game-linux.zip'
			
    withJre("/usr/lib/jvm/java-8-oracle/")
  }
}