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 sale el siguiente mensaje:
no hay atributo de 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.
En primer lugar, es un poco raro, ver que ejecutas java -jar "app"
y no java -jar app.jar
Segundo, para hacer un jar ejecutable... necesitas hacer un archivo llamado META-INF/MANIFEST.MF
el archivo en sí debe tener (al menos) esta línea:
Main-Class: com.mypackage.MyClass
Donde com.mypackage.MyClass
es la clase que contiene el punto de entrada public static void main(String[] args).
Tenga en cuenta que hay varias maneras de hacer esto, ya sea con la CLI, Maven, Ant o Gradle:
Para CLI, el siguiente comando servirá: (tks @dvvrt)
jar cmvf META-INF/MANIFEST.MF <nombre-nuevo-jar>.jar <archivos a incluir>
Para Maven, algo como el siguiente fragmento debería funcionar. Ten en cuenta que esto es sólo la definición del plugin, no el pom.xml completo:
<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 una <versión>
apropiada para su proyecto).
Para Ant, el fragmento de abajo 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 -
Para Gradle:
plugins {
id 'java'
}
jar {
manifest {
attributes(
'Main-Class': 'com.mypackage.MyClass'
)
}
}
Debería haber sido java -jar app.jar
en lugar de java -jar "app"
.
La opción -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 atributo Main-Class
en él. Vea Empaquetar 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 método main
para ejecutar el programa. (Lo que es esa clase depende del programa, es imposible saberlo por la información que has proporcionado).