Creating an executable JAR using Maven and IntelliJ IDEA
Introduction
With this part of the Java challenges project, I provide the code and settings for a project that can create an executable JAR using Maven and IntelliJ IDEA.
Below, I give background information on the project’s code, IntelliJ IDEA’s configuration and the used Maven configuration. I also detail some issues that can occur when creating an executable JAR using Maven, for which I provide possible solutions.
This project builds on Setting up a Java project using IntelliJ IDEA and Setting up a Java project using Maven and IntelliJ IDEA.
1. Background
1.1 Java
1.1.1 Code
For demonstrative purposes, the current project contains only a single Java class called Main
, which consists of a main
method outputting a well-known message:
package nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
1.2 IntelliJ IDEA
The basic configuration of this project is described in the IntelliJ IDEA section of Setting up a Java project using IntelliJ IDEA. Additional details regarding the IntelliJ IDEA run configurations of the current project are given in what follows.
1.2.1 Configuration
Run configurations
This project comes with three run configurations.
This first run configuration is called Main
and directly executes the main
method of the Main
class.
The other two run configurations, respectively, create a JAR and execute it.
1.3 Maven
The configuration used in this project extends the Maven configuration of Setting up a Java project using Maven and IntelliJ IDEA. Additional details regarding the Maven configuration of the current project are given in what follows.
1.3.1 Configuration
Maven JAR plugin
To ensure that the JAR created by Maven is executable, the project object model of the current project, pom.xml, contains the following configuration for the Maven JAR plugin:
<project>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>
nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone.Main
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
Here, the latest version of the Maven JAR plugin (3.3.0 at the time of writing) is selected, and the main class is configured to be:
nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone.Main
1.3.2 Build
The executable JAR can be built using the following command:
mvn clean install
2. Issues and solutions
While setting up and building a Maven project, several issues may occur. I partly documented these issues in the Issues and solutions section of Setting up a Java project using Maven and IntelliJ IDEA.
Additional problems may occur when trying to execute a JAR created using Maven. Below, I describe the issues related to the Maven JAR plugin, including possible solutions.
2.1 Maven JAR plugin issues
Several issues may arise with the Maven JAR plugin.
2.1.1 no main manifest attribute, in executable-jar-maven-intellij-1.0-SNAPSHOT.jar
When trying to execute a JAR, an error similar to the following may occur:
no main manifest attribute, in executable-jar-maven-intellij-1.0-SNAPSHOT.jar
To solve this problem, use the build
section of the project object model, pom.xml
, to configure the Maven JAR plugin.
Specifically, set the main class property to the fully qualified name of the class with which execution has to start.
For the current project, the build
section of pom.xml
contains the following directives:
<project>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>
nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone.Main
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
Here, the latest version of the Maven JAR plugin (3.3.0 at the time of writing) is selected, and the main class is specified as follows:
nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone.Main
2.1.2 Could not find or load main class
When trying to execute a JAR, an error similar to the following may occur:
Error: Could not find or load main class nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone.NonExisting
Caused by: java.lang.ClassNotFoundException: nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone.NonExisting
Such an error is caused by a faulty specification of the main class of your project.
To solve this problem, ensure that the Maven JAR plugin is correctly configured in the build
section of the project object model, pom.xml
.
In particular, set the main class property to the proper fully qualified path of the class with which execution has to start.
For the current project, the configuration of the Maven JAR plugin looks as follows:
<project>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>
nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone.Main
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
Here, the latest version of the Maven JAR plugin (3.3.0 at the time of writing) is selected, and the main class is specified as follows:
nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone.Main
2.1.3 Main method not found in class
When trying to execute a JAR, an error similar to the following may occur:
Error: Main method not found in class nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone.Main, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
This error arises when the main class of your project does not contain a proper main method.
To solve this problem, ensure that your project’s main class contains a method with the following signature:
public static void main(String[] args) {
// ...
}
For the current project, the configuration of the Maven JAR plugin that is part of the build
section of the project object model, pom.xml
, looks as follows:
<project>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>
nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone.Main
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
Here, the latest version of the Maven JAR plugin (3.3.0 at the time of writing) is selected, and the main class is configured to be:
nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone.Main
This main class contains a main method with a recognized signature:
package nl.mauritssilvis.challenges.java.intellij.maven.jars.executable.standalone;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
License
Copyright © 2021–2023 Maurits Silvis
This source code package is subject to the terms and conditions defined in the GNU General Public License v3.0 or later.