I am trying to install an executable JAR file and getting error "no main manifest attribute, in 'app.jar". How to resolve this issue?

I’ve installed an application, which is an executable JAR file. However, when I try to run it using the command java -jar "app.jar", nothing happens. Instead, I receive the following message: “no main manifest attribute, in ‘app.jar’”.

Typically, if I had created the program myself, I would have added a main class attribute to the manifest file. However, since the JAR file is from an application I did not develop, I cannot modify the manifest file. I also tried extracting the JAR to search for the main class, but there are too many classes and none of them seem to have “main” in their names.

The application runs without issues on other systems, so there must be a way to fix this problem. Any suggestions on how to resolve this issue would be greatly appreciated.

Hey Miroslv,

Firstly, it’s worth noting that the command should be java -jar app.jar, not java -jar "app", assuming your JAR file is named app.jar.

To make a JAR file executable, you need to include a manifest file named META-INF/MANIFEST.MF within the JAR. This file should contain at least one line:

Main-Class: com.mypackage.MyClass

Here, com.mypackage.MyClass should be replaced with the class that contains the public static void main(String[] args) method, which serves as the entry point to your application.

There are several ways to accomplish this, depending on your build tool:

Command Line (CLI):

jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>

Maven:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.1.0</version>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.mypackage.MyClass</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

Ant:

<jar destfile="build/main/checksites.jar">
  <fileset dir="build/main/classes"/>
  <zipfileset includes="**/*.class" src="lib/main/some.jar"/>
  <manifest>
    <attribute name="Main-Class" value="com.acme.checksites.Main"/>
  </manifest>
</jar>

Gradle:

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}

These configurations specify the main class to use when running the JAR, ensuring it is executable.

It should have been java -jar app.jar instead of java -jar "app".

The -jar option in Java is used to run executable JAR files, which require a manifest file with a Main-Class attribute. You can learn how to create an executable JAR by reading the documentation on Packaging Programs in JAR Files.

If the JAR file is not an executable JAR, then you’ll need to run the program using a command like this:

java -cp app.jar com.somepackage.SomeClass

Here, com.somepackage.SomeClass should be replaced with the appropriate class that contains the main method to run the program. The exact class to use depends on the program, so it’s important to know the correct class name in your specific case.

Hey Priyanka,

I appreciate your feedback! If the JAR file runs on other systems by double-clicking, it likely means that those systems are configured to run JAR files as executable. This configuration might be set up to use a specific program (such as Java) to handle JAR files automatically.

To replicate this behavior on your system, you can create a simple script or shortcut that runs the JAR file using the Java executable. Here’s an example for Windows:

  1. Create a new text file and paste the following command into it:

@echo off java -jar “app.jar”

  1. Save the file with a .bat extension, such as run_app.bat.

  2. Double-click the .bat file to run the JAR file.

This script essentially mimics the double-click behavior by explicitly running the JAR file using Java. Adjust the script as needed for other operating systems.