Pregunta No se puede ejecutar jar-file: "no hay atributo de manifiesto principal"


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

java -jar "app.jar"

Recibo el siguiente mensaje:

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

Normalmente, si yo mismo hubiera creado el programa, habría agregado un atributo de clase principal al archivo de manifiesto. Pero en este caso, dado que el archivo es de una aplicación, no puedo hacer eso. También intenté extraer el contenedor para ver si podía encontrar la clase principal, pero hay muchas clases y ninguna de ellas tiene la palabra "principal" en su nombre. Debe haber una manera de solucionar esto porque el programa funciona bien en otros sistemas.


613
2018-03-13 18:20


origen


Respuestas:


Primero, es un poco raro verte partir java -jar "app" y no java -jar app.jar

En segundo lugar, para hacer que un archivo jar sea ejecutable ... debe extraer un archivo llamado META-INF / MANIFEST.MF

el archivo en sí debe tener (al menos) este trazador de líneas:

Main-Class: com.mypackage.MyClass

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

Tenga en cuenta que hay varias maneras de hacerlo bien con CLI, Maven, Ant o Gradle:

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

por Maven, algo así como el siguiente fragmento debería hacer el truco. Tenga en cuenta que esta es solo la definición del complemento, no la completa pom.xml:

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

(Elija un <version> apropiado para su proyecto)

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

por Gradle:

plugins {
    id 'java'
}

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

591
2018-03-13 18:27



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

los -jar La opción solo funciona si el archivo JAR es un archivo JAR ejecutable, lo que significa que debe tener un archivo de manifiesto con una Main-Class atributo en ella. Ver Programas de empaquetado en archivos JAR para aprender a crear un JAR ejecutable.

Si no es un archivo JAR ejecutable, deberá ejecutar el programa con algo como:

java -cp app.jar com.somepackage.SomeClass

dónde com.somepackage.SomeClass es la clase que contiene el main método para ejecutar el programa. (Lo que esa clase es depende del programa, es imposible saber a partir de la información que ha proporcionado).


196
2018-03-13 18:27



Alternativamente, puede usar maven-assembly-plugin, como se muestra en el siguiente ejemplo:

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

En este ejemplo, todos los jar de dependencia especificados en la sección se incluirán automáticamente en su jar individual. Tenga en cuenta que jar-with-dependencies debe colocarse literalmente como, no para ser reemplazado con los nombres de archivo jar que desea incluir.


76
2017-12-26 22:44



Eso es porque Java no puede encontrar el atributo Principal en el archivo MANIFEST.MF. El atributo Principal es necesario para indicar a java qué clase debe usar 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 de MANIFEST.MF se ve así:

Main-Class: <packagename>.<classname>

Obtiene este error de "no atributo de manifiesto principal" cuando esta línea falta en el archivo MANIFEST.MF.

Realmente es un gran desastre especificar este atributo dentro del archivo MANIFEST.MF.

Actualización: Acabo de encontrar una manera muy clara de especificar el punto de entrada de la Aplicación en Eclipse. Cuando dices Exportar,

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


47
2017-09-29 00:26



La respuesta de Gradle es agregar una configuración jar / manifestar / atributos como esta:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}

25
2018-05-10 00:15



Pruebe este comando para incluir el jar:

java -cp yourJarName.jar your.package..your.MainClass

18
2017-08-23 07:31



Para maven, esto es lo que lo resolvió (para mí, para un código de 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>

Aclamaciones...


17
2018-03-01 16:06



Tuve este problema al crear un jar usando IntelliJ IDEA. Ver esta discusión.

Lo que me solucionó fue volver a crear el artefacto de jar, eligiendo JAR> De módulos con dependencias, pero no aceptando el Directorio predeterminado para META-INF / MANIFEST.MF. Cambie desde - / src / main / java a - / src / main / resources.

De lo contrario, incluía un archivo de manifiesto en el contenedor, pero no el que está en - / src / main / java que debería tener.


12
2017-08-09 16:51



Para mí, ninguna de las respuestas realmente me ayudó: tenía el archivo de manifiesto en el lugar correcto, contenía la clase principal y todo. Lo que me hizo tropezar fue esto:

Advertencia: el archivo de texto desde el que está creando el manifiesto debe   terminar con una nueva línea o retorno de carro. La última línea no será   analizado correctamente si no termina con una nueva línea o retorno de carro.

(fuente) Agregar una nueva línea al final del manifiesto lo solucionó.


10
2018-01-25 09:15