242 votos

No se puede ejecutar el archivo jar: "no hay atributo de manifiesto principal"

He instalado una aplicación, cuando intento ejecutarla (es un jar ejecutable) no pasa nada. Cuando la ejecuto desde la línea de comandos con:

java -jar "app".jar

Me aparece el siguiente mensaje:

ningún atributo del manifiesto principal, en "app".jar

Normalmente, si hubiera creado el programa yo mismo, habría añadido un atributo de clase principal al archivo de manifiesto. Pero en este caso, como el archivo es de una aplicación, no puedo hacerlo. También intenté extraer el jar para ver si podía encontrar la clase principal, pero hay demasiadas clases y ninguna de ellas tiene la palabra "main" en su nombre. Debe haber una manera de arreglar esto porque el programa funciona bien en otros sistemas.

248voto

Olivier Refalo Puntos 12606

En primer lugar, es un poco raro, ver que se ejecuta java -jar "app" y no java -jar app.jar

En segundo lugar, para hacer un jar ejecutable... necesitas hacer un archivo llamado META-INF/MANIFEST.MF

el propio archivo debería tener (al menos) esta línea:

Main-Class: com.mypackage.MyClass

Dónde com.mypackage.MyClass es la clase que contiene el public static void main(String[] args) punto de entrada.

Tenga en cuenta que hay varias maneras de hacer esto, ya sea con la CLI, Maven o Ant:

Para CLI el siguiente comando servirá: (tks @dvvrt) jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>

Para Maven Algo como el siguiente fragmento debería funcionar. Tenga en cuenta que esto es sólo la definición del plugin, no el completo pom.xml :

<build>
  <plugins>
    <plugin>
      <!-- Build an executable JAR -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.4</version>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.mypackage.MyClass</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

Para Hormiga El siguiente fragmento debería ayudar:

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

Créditos Michael Niemand -

87voto

Jesper Puntos 65733

Eso debería haber sido java -jar app.jar en lugar de java -jar "app" .

El -jar sólo funciona si el archivo JAR es un archivo JAR ejecutable, lo que significa que debe tener un archivo de manifiesto con un Main-Class en él. Véase Empaquetado de programas en archivos JAR para aprender a crear un JAR ejecutable.

Si no es un JAR ejecutable, entonces tendrás que ejecutar el programa con algo como

java -cp app.jar com.somepackage.SomeClass

donde com.somepackage.SomeClass es la clase que contiene el main para ejecutar el programa. (Lo que es esa clase depende del programa, es imposible decirlo a partir de la información que has suministrado).

30voto

Sasanka Panguluri Puntos 1405

Esto se debe a que Java no puede encontrar el atributo Main en el archivo MANIFEST.MF. El atributo Main es necesario para decirle a java qué clase debe utilizar como punto de entrada de la aplicación. Dentro del archivo jar, el archivo MANIFEST.MF se encuentra en la carpeta META-INF. ¿Te preguntas cómo puedes ver lo que hay dentro de un archivo jar? Abra el archivo jar con WinRAR.

El atributo principal dentro del MANIFEST.MF tiene el siguiente aspecto:

Main-Class: <packagename>.<classname>

El error "no hay atributo del manifiesto principal" se produce cuando falta esta línea en el archivo MANIFEST.MF.

Es realmente un gran lío especificar este atributo dentro del archivo MANIFEST.MF.

Actualización: Acabo de encontrar una forma muy limpia de especificar el punto de entrada de la aplicación en eclipse. Cuando se dice Export,

Select Jar and next 

[ give it a name in the next window ] and next

and next again

and you'll see " Select the class of the application entry point".

Just pick a class and Eclipse will automatically build a cool MANIFEST.MF for you.

enter image description here

7voto

Dave Puntos 226

Para maven, esto es lo que lo solucionó (para mí, para una base de código Veetle en GitHub):

<build>
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.0</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <mainClass>org.lazydevs.veetle.api.VeetleAPI</mainClass>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>
 </plugins>
</build>

Salud...

3voto

Shekh Akther Puntos 441

Cualquier archivo jar ejecutable debe ejecutarse haciendo clic o ejecutando mediante el símbolo del sistema como java -jar app.jar (utilice "si la ruta del jar contiene espacio" - es decir, java -jar " C:\folder nombre \app.jar "). Si su tarro ejecutable no se ejecuta, significa que no se ha creado correctamente.

Para una mejor comprensión, extraiga el archivo jar (o visualícelo con cualquier herramienta, para Windows 7-Zip es una buena) y compruebe el archivo en /META-INF/MANIFEST.MF. Si encuentra alguna entrada como

Main-Class: su.paquete.nombre.ClaaswithMain - entonces está bien, de lo contrario usted tiene que proporcionar.

Tenga en cuenta que la entrada Main-Class se añade al archivo MANIFEST.MF, ¡compruebe dónde lo guarda!

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X