How can I create an executable/runnable JAR with dependencies using Maven?

To create an executable JAR file that includes all dependencies (an “uber-JAR”) using Maven, you can use plugins like the Maven Shade Plugin or Maven Assembly Plugin. Below are step-by-step instructions for both approaches:

Method 1: Using the Maven Shade Plugin (Recommended)

The Maven Shade Plugin is the most common and modern way to bundle dependencies into a single JAR.

Step 1: Add the Shade Plugin to pom.xml

Include the following configuration in your project’s pom.xml file:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.5.1</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
              <goal>shade</goal>
          </goals>
          <configuration>
              <transformers>
                  <!-- Specify the main class -->
                  <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                      <mainClass>com.yourpackage.MainClass</mainClass>
                  </transformer>
              </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Step 2: Replace com.yourpackage.MainClass

  • Replace com.yourpackage.MainClass with the fully qualified name of your application’s main class (the one containing the public static void main(String[] args) method).

Step 3: Build the JAR

Run the following command in your terminal:

mvn clean package

Step 4: Run the JAR

The executable JAR will be generated in the target directory. Run it with:

java -jar target/your-project-name-version-shaded.jar

Method 2: Using the Maven Assembly Plugin

The Maven Assembly Plugin is an older approach but still valid.

Step 1: Add the Assembly Plugin to pom.xml

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>3.7.1</version>
      <configuration>
          <!-- Specify the main class -->
          <archive>
              <manifest>
                  <mainClass>com.yourpackage.MainClass</mainClass>
              </manifest>
          </archive>
          <descriptorRefs>
              <!-- This bundles all dependencies into one JAR -->
              <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
      </configuration>
      <executions>
          <execution>
              <phase>package</phase>
              <goals>
                  <goal>single</goal>
              </goals>
          </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Step 2: Replace com.yourpackage.MainClass

  • Replace com.yourpackage.MainClass with your main class.

Step 3: Build the JAR

mvn clean package

Step 4: Run the JAR

The JAR will be named your-project-name-version-jar-with-dependencies.jar:

java -jar target/your-project-name-version-jar-with-dependencies.jar

Method 3: Spring Boot Applications

For Spring Boot projects, use the Spring Boot Maven Plugin:

Step 1: Add the Spring Boot Plugin to pom.xml

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

Step 2: Build the JAR

mvn clean package

Step 3: Run the JAR

java -jar target/your-project-name-version.jar

Key Differences

PluginOutputUse Case
Maven Shade PluginSingle JAR (shaded)General-purpose applications
Maven Assembly PluginJAR with -jar-with-dependenciesLegacy projects
Spring Boot PluginExecutable JAR (includes embedded Tomcat)Spring Boot applications

Verification

  • Check if the JAR contains dependencies:
  jar tf target/your-project-name.jar | grep dependency-name

By using these plugins, you can create a self-contained, executable JAR that includes all required dependencies.

Leave a Reply

Your email address will not be published. Required fields are marked *