Problem:
no main manifest attribute, in "APPLICATION_NAME.jar"
For explanation purpose, we have an application named "Tutorial" with a class named Demo.java under com.javahungry package. Below are the content of the POM.xml and Demo.java file.
POM.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.javahungry</groupId> <artifactId>Tutorial</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Tutorial</name> </project>
Demo.java
package com.javahungry;
public class Demo { public static void main(String args[])
{ System.out.println(" Java Hungry "); } }
Solution
This error occurs whenever Main-Class property is missing from manifest file MANIFEST.MF which can be found under META-INF folder in the jar.Correct it by adding below lines to your pom.xml
<!-- include below build tag to your existing pom.xml -->
<build>
<plugins>
<plugin>
<!-- Building an executable jar -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<!-- give full qualified name of your main class-->
<mainClass>com.javahungry.Demo</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Let’s build the Tutorial application after adding the above changes in pom.xml.
Building the project in eclipse:
maven install
or run below goal from command line
mvn install
This will create a jar file of the application (in this case Tutorial-0.0.1-SNAPSHOT.jar).
Execute the JAR:
2. We will now try executing this jar manually through command line and see what happens.
• Open command prompt.
• Go to the location of the jar file (usually set to application’s target folder in the Eclipse workspace).
• Execute the command java -jar
java -jar Tutorial-0.0.1-SNAPSHOT.jar
The option -jar above only works when the JAR file is an executable JAR file. An executable JAR means JAR file must contain a manifest file with a Main-Class property in it.
If jar is not an executable JAR, then you need to run the program with below command
java -cp Tutorial-0.0.1-SNAPSHOT.jar com.javahungry.Demo
where com.javahungry.Demo is a class which contains main method to run the program.
Output :
Java Hungry
As you can see that the ‘no main manifest attribute’ related error has been resolved and our application has given us the expected output.
Fix no main manifest attribute, in jar Error in Spring Boot
Add spring-boot-maven-plugin in build section of your pom.xml. If it is not added then add the below lines<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.5.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Explanation
As we all know there must be an entry point to any java application and it must be a Java class containing the main method. In the problem we just discussed here, the manifest file was not having Main-Class property defined in it.This property is responsible for indicating the Java class which main method (public static void main(String[] args)) needs to be executed. In other words, it tells Java about the starting point of the application.
Let us see what happens if we do not include the Main-Class property in manifest file of our project.
Current MANIFEST.MF file contains below content.
MANIFEST.MF
Manifest-Version: 1.0
Built-By: Subham Mittal
Build-Jdk: 1.8.0_91
Created-By: Maven Integration for Eclipse
1. Running the application with below goal from Eclipse
Application Name --> Right Click --> Run As --> Maven Install
maven install
or run below goal from command line
mvn install
This will create a jar file of the application (in this case Tutorial-0.0.1-SNAPSHOT.jar).
2. We will now try executing this jar manually through command line and see what happens.
Execute the JAR :
1. Open command prompt.
2. Go to the location of the jar file (usually set to application’s target folder in the Eclipse workspace).
Execute the command java -jar .jar. See the example below.
java -jar Tutorial-0.0.1-SNAPSHOT.jar
Output :
no main manifest attribute, in Tutorial-0.0.1-SNAPSHOT.jar
As we can deduce that this error has occurred because we did not define any starting point for the Tutorial application while creating the Tutorial-0.0.1-SNAPSHOT.jar file. The MANIFEST.MF file that was generated by default did not contain Main-Class property in this case.
Let’s have a look at the generated default manifest file.
MANIFEST.MF
Manifest-Version: 1.0
Built-By: Subham Mittal
Build-Jdk: 1.8.0_91
Created-By: Maven Integration for Eclipse
You can see Main-Class property is missing in the above MANIFEST.MF file.
To fix this issue, we have taken help of maven-jar-plugin which provides jar building capabilities. In the newer versions of this plugin like 3.1.2, we are supposed to define our own manifest file as “useDefaultManifestFile” parameter has been removed from the plugin configuration.
We added maven-jar-plugin in pom.xml with mainClass property inside it.
<mainClass>com.javahungry.Demo</mainClass>
MANIFEST.MF (after including maven-jar-plugin and mainClass property in the pom file):
Manifest-Version: 1.0
Built-By: Subham Mittal
Build-Jdk: 1.8.0_91
Created-By: Maven Integration for Eclipse
Main-Class: com.javahungry.Demo
Check out the highlighted "Main-Class" property that has been added to the manifest file after we have updated the pom file (refer Solution part). It indicates that the main method of com.javahungry.Demo class of our Tutorial application will be executed. That's all for the post no main manifest attribute in jar error. Please mention in the comments if you are still facing the error or solve it by any other method.
References:
Default Manifest
Apache Maven jar plugin