Can't execute jar- file: "no main manifest attribute" Can't execute jar- file: "no main manifest attribute" java java

Can't execute jar- file: "no main manifest attribute"


First, it's kind of weird, to see you run java -jar "app" and not java -jar app.jar

Second, to make a jar executable... you need to jar a file called META-INF/MANIFEST.MF

the file itself should have (at least) this one liner:

Main-Class: com.mypackage.MyClass

Where com.mypackage.MyClass is the class holding the public static void main(String[] args) entry point.

Note that there are several ways to get this done either with the CLI, Maven, Ant or Gradle:

For CLI, the following command will do: (tks @dvvrt)

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

For Maven, something like the following snippet should do the trick. Note that this is only the plugin definition, not the full pom.xml:

Latest doc on this plugin: see https://maven.apache.org/plugins/maven-jar-plugin/

<build>  <plugins>    <plugin>      <!-- Build an executable JAR -->      <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>

(Pick a <version> appropriate to your project.)

For Ant, the snippet below should help:

<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>

Credits Michael Niemand -

For Gradle:

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


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

The -jar option only works if the JAR file is an executable JAR file, which means it must have a manifest file with a Main-Class attribute in it. See Packaging Programs in JAR Files to learn how to create an executable JAR.

If it's not an executable JAR, then you'll need to run the program with something like:

java -cp app.jar com.somepackage.SomeClass

where com.somepackage.SomeClass is the class that contains the main method to run the program. (What that class is depends on the program, it's impossible to tell from the information you've supplied).


Alternatively, you can use maven-assembly-plugin, as shown in the below example:

<plugin>    <artifactId>maven-assembly-plugin</artifactId>    <executions>      <execution>        <phase>package</phase>        <goals>          <goal>single</goal>        </goals>      </execution>    </executions>    <configuration>      <archive>        <manifest>          <addClasspath>true</addClasspath>          <mainClass>com.package.MainClass</mainClass>        </manifest>      </archive>      <descriptorRefs>        <descriptorRef>jar-with-dependencies</descriptorRef>      </descriptorRefs>    </configuration>  </plugin> 

In this example all the dependency jars as specified in section will be automatically included in your single jar. Note that jar-with-dependencies should be literally put as, not to be replaced with the jar file names you want to include.