Compiling a java program into an executable
Categories:
Compiling Java Programs into Executable Files

Learn how to package your Java applications into standalone executable files for easy distribution and deployment, covering JARs, native images, and platform-specific bundles.
Java applications are typically distributed as .jar
(Java Archive) files, which are essentially ZIP files containing compiled Java bytecode (.class
files) and associated resources. While JARs are portable, they require a Java Runtime Environment (JRE) to be installed on the target machine. For users who don't have a JRE or prefer a single, self-contained executable, converting a Java program into a native executable can be highly beneficial. This article explores various methods to achieve this, from standard JARs to native images and platform-specific launchers.
Understanding Java Archives (JARs)
The most fundamental way to package a Java application is by creating a JAR file. A JAR file bundles all the class files, resources, and metadata into a single file. For an application to be runnable directly from a JAR, it must contain a META-INF/MANIFEST.MF
file with a Main-Class
entry, specifying the entry point of your application. While not a 'native executable' in the traditional sense, a runnable JAR is the first step towards distribution.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Executable Java!");
}
}
A simple 'Hello World' Java program.
1. Compile the Java code
Use the Java compiler (javac
) to compile your .java
source files into .class
bytecode files.
2. Create a Manifest file
Create a MANIFEST.MF
file that specifies the main class. Ensure there's a newline at the end of the file.
3. Package into a JAR
Use the jar
tool to bundle the compiled classes and the manifest file into a runnable JAR.
4. Run the JAR
Execute the JAR file using the java -jar
command.
javac HelloWorld.java
echo "Main-Class: HelloWorld" > manifest.txt
jar cvfm HelloWorld.jar manifest.txt HelloWorld.class
java -jar HelloWorld.jar
Command-line steps to compile and run a basic JAR file.
Creating Native Executables with GraalVM Native Image
GraalVM Native Image is a revolutionary technology that allows you to compile Java applications into standalone native executables. These executables start almost instantly, use less memory, and do not require a pre-installed JRE. They are platform-specific, meaning you'll need to build a separate executable for Windows, macOS, and Linux.
flowchart TD A[Java Source Code] --> B[javac] B --> C[Java Bytecode (.class)] C --> D[JAR File] D --> E{"GraalVM Native Image Tool"} E --> F[Platform-Specific Native Executable] F --> G[Run without JRE]
Process of creating a native executable using GraalVM Native Image.
1. Install GraalVM
Download and install GraalVM, then install the native-image
component using gu install native-image
.
2. Compile your Java application
Ensure your application is compiled into a runnable JAR file, including all its dependencies.
3. Generate the native image
Use the native-image
command, pointing to your application's main class or JAR file.
4. Run the native executable
Execute the generated file directly from your operating system's command line.
# Assuming HelloWorld.jar is already created
native-image -jar HelloWorld.jar
./helloworld # On Linux/macOS
.\helloworld.exe # On Windows
Commands to generate and run a native executable with GraalVM.
Platform-Specific Launchers and Installers
For a more polished user experience, especially for desktop applications, you might want to create platform-specific installers or bundles. Tools like jpackage
(part of the JDK since Java 14) can create self-contained application bundles that include a custom JRE, making them truly standalone and providing native installers (e.g., .msi
for Windows, .dmg
for macOS, .deb
/.rpm
for Linux).
jpackage --input lib --main-jar myapp.jar --main-class com.example.MyMainClass --name "My Java App" --type app-image --dest output
Example jpackage
command to create an application image.
jpackage
creates an application image first, which is a directory containing your app and a private JRE. You can then use --type msi
, --type dmg
, etc., to create platform-specific installers from this image.