Develop with Java on Ubuntu

This tutorial provides basic guidance on how to use of the Java toolchain for development on Ubuntu. It shows how to create a ‘Hello, world!’ program and explains how to build projects using Gradle or Maven.

For instructions on how to install Java and related tooling, including IDEs, see the dedicated guide on How to set up a development environment for Java on Ubuntu. This article assumes that tooling suggested in that article has been installed.

javac vs build systems

javac is the actual compiler, but developers usually use build systems to compile, build, and package Java projects. Gradle and Maven are popular tools for building Java projects.

To use javac directly, refer to the example Compiling Java application using javac directly.

Creating a Java project using Maven

Setting up and building a new Java project using the Apache Maven tool.

Prerequisites

Maven project

  1. Create a new Java project using the archetype:generate Maven sub-command:

    mvn archetype:generate -DgroupId=com.yourcompany \
        -DartifactId=helloworld -Dversion=1.0-SNAPSHOT \
        -Dpackage=com.yourcompany.helloworld \
        -DarchetypeGroupId=org.apache.maven.archetypes \
        -DarchetypeArtifactId=maven-archetype-quickstart \
        -DarchetypeVersion=1.4
    

    Press Enter when prompted to confirm your selection.

    This creates a new project using Maven Quickstart Archetype.

    Maven sets up a basic project structure:

    dev@ubuntu:~$ tree
    .└── helloworld    ├── pom.xml    └── src    ├── main       └── java           └── com               └── yourcompany                   └── helloworld                       └── App.java    └── test        └── java            └── com                └── yourcompany                    └── helloworld                        └── AppTest.java

    That includes a ‘Hello World’ application and a unit test:

    src/main/java/com/yourcompany/helloworld/App.java
    package com.yourcompany.helloworld;
    
    /**
    * Hello world!
    *
    */
    public class App
    {
        public static void main( String[] args )
        {
            System.out.println( "Hello World!" );
        }
    }
    
    src/test/java/com/yourcompany/helloworld/AppTest.java
    package com.yourcompany.helloworld;
    
    import static org.junit.Assert.assertTrue;
    
    import org.junit.Test;
    
    /**
    * Unit test for simple App.
    */
    public class AppTest
    {
        /**
        * Rigorous Test :-)
        */
        @Test
        public void shouldAnswerWithTrue()
        {
            assertTrue( true );
        }
    }
    
  2. Change to the project directory:

    cd helloworld
    
  3. Build and package the application:

    mvn -Dmaven.compiler.release=8 package
    

    Note

    Notice the -Dmaven.compiler.release=8 option. The maven-archetype-quickstart archetype generates a project that targets Java 7, which is no longer supported by the Java 21 LTS release. The project target can be changed by updating the maven.compiler.target and maven.compiler.source properties in the pom.xml file.

    This builds and runs unit tests.

    Run the application:

    dev@ubuntu:~$ java -cp target/helloworld-1.0-SNAPSHOT.jar com.yourcompany.helloworld.App
    Hello World!

Creating a Java project using Gradle

Setting up and building a new Java project using the Gradle build tool.

Prerequisites

  • Java Development Kit; refer to Installing Java Development Kit.

  • Gradle:

    Download Gradle from the Gradle Releases page and follow the provided instructions: Installing manually.

    Note

    Gradle introduced Java 21 support in version 8.5.

    Alternatively, to install the community-maintained Gradle snap, run:

    sudo snap install gradle
    

    The snap provides Gradle version 7, which does not support Java 21.

    Note

    The snap requires setting up the JAVA_HOME variable. For example:

    export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
    

Gradle project

  1. Create a Java project using the gradle init command:

    mkdir helloworld
    cd helloworld
    cd helloworld
    gradle init \
        --type java-application \
        --dsl kotlin \
        --test-framework junit-jupiter \
        --package com.yourcompany.helloworld \
        --project-name helloworld  \
        --no-split-project \
        --no-incubating
    

    Press Enter when prompted for the Java version.

    Gradle sets up a basic project structure:

    dev@ubuntu:~$ tree
    .└── helloworld-gradle    ├── app       ├── build.gradle.kts       └── src           ├── main              ├── java                 └── com                     └── yourcompany                         └── helloworld                             └── App.java              └── resources           └── test               ├── java                  └── com                      └── yourcompany                          └── helloworld                              └── AppTest.java               └── resources    ├── gradle       ├── libs.versions.toml       └── wrapper           ├── gradle-wrapper.jar           └── gradle-wrapper.properties    ├── gradlew    ├── gradlew.bat    └── settings.gradle.kts

    That includes a ‘Hello World’ application and a unit test:

    app/src/main/java/com/yourcompany/helloworld/App.java
    /*
    * This Java source file was generated by the Gradle 'init' task.
    */
    package com.yourcompany.helloworld;
    
    public class App {
        public String getGreeting() {
            return "Hello World!";
        }
    
        public static void main(String[] args) {
            System.out.println(new App().getGreeting());
        }
    }
    
    app/src/test/java/com/yourcompany/helloworld/AppTest.java
    /*
    * This Java source file was generated by the Gradle 'init' task.
    */
    package com.yourcompany.helloworld;
    
    import org.junit.jupiter.api.Test;
    import static org.junit.jupiter.api.Assertions.*;
    
    class AppTest {
        @Test void appHasAGreeting() {
            App classUnderTest = new App();
            assertNotNull(classUnderTest.getGreeting(), "app should have a greeting");
        }
    }
    
  2. Build and run the project using the generated Gradle Wrapper:

    dev@ubuntu:~$ ./gradlew run
    Downloading https://services.gradle.org/distributions/gradle-8.10.1-bin.zip.............10%.............20%.............30%.............40%.............50%.............60%.............70%.............80%.............90%.............100% > Task :app:runHello World! BUILD SUCCESSFUL in 31s2 actionable tasks: 2 executed

Compiling Java application using javac directly

Compiling a Java application directly using the javac tool.

Prerequisites

Procedure

  1. Create a ‘Hello World’ application in a file named App.java:

    public class App {
        public String getGreeting() {
            return "Hello World!";
        }
    
        public static void main(String[] args) {
            System.out.println(new App().getGreeting());
        }
    }
    
  2. Compile the class file in the out directory:

    javac App.java -d out
    
  3. Execute the program:

    dev@ubuntu:~$ java -cp out/ App
    Hello World!

Running Java application as a shebang script

Running a Java application as a script with the java interpreter specified using the ‘shebang’ (#!) interpreter directive.

Prerequisites

Procedure

  1. Create a ‘Hello World’ application in a file named App and include the interpreter directive on the first line:

    App
    #!/usr/bin/java
    public class App {
        public String getGreeting() {
            return "Hello World!";
        }
    
        public static void main(String[] args) {
            System.out.println(new App().getGreeting());
        }
    }
    

    Note

    This file does not have a .java extension.

  2. Make the file executable:

    chmod +x App
    
  3. Run the application:

    dev@ubuntu:~$ ./App
    Hello World!