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"
Me sale el siguiente mensaje:
sin atributo manifiesto principal, en "app.jar"
Normalmente, si hubiera creado el programa yo mismo, 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 frasco 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 arreglar esto porque el programa funciona bien en otros sistemas.
javap
. Sin embargo, es posible que desee deshacerlo y ver si realmente no hay manifiesto.Respuestas:
Primero, es un poco extraño verte correr
java -jar "app"
y nojava -jar app.jar
En segundo lugar, para hacer que un jar sea ejecutable ... necesita jar un archivo llamado META-INF / MANIFEST.MF
el archivo en sí debería tener (al menos) este revestimiento:
¿Dónde
com.mypackage.MyClass
está la clase que contiene el punto de entrada public static void main (String [] args) ?Tenga en cuenta que hay varias formas de hacerlo, ya sea con la CLI, Maven, Ant o Gradle:
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 hacer el truco. Tenga en cuenta que esta es solo la definición del complemento, no el pom.xml completo :
(Elija un
<version>
apropiado para su proyecto).Para Ant , el fragmento a continuación debería ayudar:
Créditos Michael Niemand -
Para Gradle :
fuente
lib
carpeta, solo necesita ejecutar el jar conjava -jar myproject.jar
y encontrará las dependencias.jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
maven-jar-plugin
elemento en el archivo Maven generado por VSC, así que solo le agregué la<configuration>
sección.Eso debería haber sido en
java -jar app.jar
lugar dejava -jar "app"
.La
-jar
opción solo funciona si el archivo JAR es un archivo JAR ejecutable, lo que significa que debe tener un archivo de manifiesto con unMain-Class
atributo. Consulte Programas de empaquetado en archivos JAR para aprender a crear un JAR ejecutable.Si no es un JAR ejecutable, deberá ejecutar el programa con algo como:
donde
com.somepackage.SomeClass
es la clase que contiene elmain
método para ejecutar el programa. (Lo que es esa clase depende del programa, es imposible saber de la información que ha proporcionado).fuente
META-INF
directorio dentro del archivo JAR). Debe contener unMain-Class
atributo que le dé el nombre de la clase principal.Alternativamente, puede usar maven-assembly-plugin, como se muestra en el siguiente ejemplo:
En este ejemplo, todos los archivos jar de dependencia como se especifica en la sección se incluirán automáticamente en su archivo jar individual. Tenga en cuenta que jar-with-dependencies se debe poner literalmente como, no se debe reemplazar con los nombres de archivo jar que desea incluir.
fuente
maven-assembly-plugin
trabajado.maven-jar-plugin
No.pom.xml
archivo dentro<build><plugins> PUT IT HERE </plugins></build>
y luego ejecute el paquete maven (en IDEA abra el menú deslizante de maven a la derecha, busque proyecto> Ciclo de vida> paquete). Entonces su archivo jar estará en la carpeta Target. ¡Salud!Esto se debe a que Java no puede encontrar el atributo Main en el archivo MANIFEST.MF. El atributo Main es necesario para indicarle 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 del MANIFEST.MF se ve así:
Obtiene este error "sin atributo de manifiesto principal" cuando falta esta línea en el archivo MANIFEST.MF.
Es realmente 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,
fuente
Tuve el mismo problema. agregando las siguientes líneas al archivo pom lo hizo funcionar. El complemento se asegurará del proceso de compilación de su aplicación con todos los pasos necesarios.
fuente
<parent>...</parent>
aplicación en pom.xml. Supongo que si visitamosparent
pom.xml de la aplicación, tendremos una idea clara.repackage-classifier
. Visite docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…La respuesta de Gradle es agregar una configuración jar / manifest / atributos como esta:
fuente
Tuve este problema al crear un jar usando IntelliJ IDEA. Ver esta discusión .
Lo que me resolvió fue volver a crear el artefacto jar, eligiendo JAR> De los módulos con dependencias, pero sin aceptar el Directorio predeterminado para META-INF / MANIFEST.MF. Cámbielo de - / src / main / java a - / src / main / resources.
De lo contrario, incluía un archivo de manifiesto en el archivo jar, pero no el de - / src / main / java que debería tener.
fuente
Para Maven, esto es lo que lo resolvió (para mí, para una base de código Veetle en GitHub):
Salud...
fuente
mvn package shade:shade
solo ejecutarmvn package
no activó el complemento de sombra para ejecutarse.Pruebe este comando para incluir el jar:
fuente
Para mí, ninguna de las respuestas realmente ayudó: tenía el archivo de manifiesto en el lugar correcto, que contenía la clase principal y todo. Lo que me hizo tropezar fue esto:
( fuente ) Agregar una nueva línea al final del manifiesto lo arregló.
fuente
Si usa Maven, incluya lo siguiente en el pom
fuente
no main manifest attribute
errores, pero estoy trabajando en la aplicación de arranque de primavera, por lo que esta respuesta me ayudó. Ya sabía cómo crear unMETA-INF/MANIFEST.MF
archivo, pero no cómo hacer que Spring-boot lo maneje automáticamente.spring-boot
simplemente ignórelo. Stackoverflow también ayuda a construir su propio repositorio de problemas que enfrenta durante la programación.Tuve el mismo problema hoy. Mi problema se resolvió al mover META-INF a la carpeta de recursos.
fuente
Tengo el mismo error en este momento. Si está utilizando
gradle
, simplemente agregue el siguiente en su urgradle.build
:Donde
com.company.project.MainClass
camino a su clase conpublic static void main(String[] args)
método.fuente
mainClassName
conjunto de variables de nivel superior , pero eso solo ayuda con elgradle run
comando, no con la creación de un archivo ejecutable .jar¡El problema de MAVEN es que intenta incluir el primer archivo MANIFEST.MF de la primera biblioteca de dependencias en lugar de THE OWN DOWN MANIFEST.MF CUANDO UTILIZA ARTEFACTOS! .
Copie el MANIFEST.MF real que ya genera MAVEN en su proyecto, que incluye algunos que:
Versión de manifiesto: 1.0 Main-Class: yourpacket.yourmainclass (para exmaple info.data.MainClass)
Reemplace el contenido de MANIFEST.MF de youjar.zip con él.
¡O!
Simple crea tu propio MANIFEST.MF y:
Pero si usa el panel maven (o la línea de comando maven) puede forzarlo a generar su propio manifiesto e incluirlo en el archivo JAR.
Agregue a la sección de compilación de you pom.xml este código:
Abra el panel MAVEN (en Intellij) y ejecute "Instalar". Generará el archivo MANIFEST y compilará la propiedad del archivo JAR con todas las dependencias en la carpeta "Target". También se instalará en el repositorio local de Maven.
fuente
Si el jar no sigue las reglas , no es un jar ejecutable.
fuente
Me enfrenté al mismo problema y ahora está solucionado :) Simplemente siga los pasos a continuación y el error podría ser cualquier cosa, pero los pasos a continuación hacen que el proceso sea más fluido. Paso mucho tiempo para encontrar la solución.
1. Intente reiniciar Eclipse (si está utilizando Eclipse para construir un archivo JAR) -> En realidad, esto ayudó a mi problema al exportar el archivo JAR correctamente.
2.Después de reiniciar el eclipse, intente ver si su eclipse puede reconocer la clase / método principal por su proyecto Java -> haga clic con el botón derecho -> Ejecutar como -> Ejecutar configuraciones -> Principal -> haga clic en el botón Buscar para ver si su eclipse puede buscar su clase principal en el archivo JAR. -> Esto es para la validación de que el archivo JAR tendrá el punto de entrada a la clase principal.
Después de esto, exporte su proyecto dinámico de Java como archivo "JAR ejecutable" y no como archivo JAR.
En la configuración de inicio de Java, elija su clase principal.
Una vez que exporte el archivo jar, utilice el siguiente comando para ejecutar. java -cp [Your JAR] .jar [paquete completo] .MainClass por ejemplo: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit
Puede enfrentar el error de versión de Java no compatible. la solución es cambiar java_home en su perfil bash de shell para que coincida con la versión de java utilizada para compilar el proyecto en eclipse.
¡Espero que esto ayude! Por favor, avíseme si todavía tiene algún problema.
fuente
Yo tuve el mismo problema. Muchas de las soluciones mencionadas aquí no me dieron la imagen completa, así que intentaré darle un resumen de cómo empaquetar archivos jar desde la línea de comandos .
Si desea tener sus
.class
archivos en paquetes, agregue el paquete al comienzo de.java
.Test.java
Para compilar su código con sus
.class
archivos que terminan con la estructura dada por el nombre del paquete, use:los
-d .
hace que el compilador cree la estructura de directorios que desea.Al empaquetar el
.jar
archivo, debe instruir a la rutina jar sobre cómo empacarlo. Aquí usamos el conjunto de opcionescvfeP
. Esto es para mantener la estructura del paquete (opciónP
), especificar el punto de entrada para que el archivo de manifiesto contenga información significativa (opcióne
). La opción lef
permite especificar el nombre del archivo, la opciónc
crea un archivo comprimido y la opciónv
establece el resultado en detallado. Las cosas importantes a tener en cuenta aquí sonP
ye
.Luego viene el nombre de la jarra que queremos
test.jar
.Luego viene el punto de entrada.
Y luego viene
-C . <packagename>/
a obtener los archivos de clase de esa carpeta, preservando la estructura de la carpeta.Verifique su
.jar
archivo en un programa zip. Debe tener la siguiente estructuratest.jar
El MANIFEST.MF debe contener lo siguiente
Si edita su manifiesto a mano, asegúrese de mantener la nueva línea al final; de lo contrario, Java no la reconocerá.
Ejecute su
.jar
archivo confuente
Personalmente, creo que todas las respuestas aquí son una mala comprensión de la pregunta. La respuesta a esto radica en la diferencia de cómo spring-boot construye el .jar. Todo el mundo sabe que Spring Boot establece un manifiesto como este, que varía de la suposición de todos de que se trata de un lanzamiento .jar estándar, que puede o no ser:
Quizás necesita ejecutarse con
org.springframework.boot.loader.JarLauncher
en el classpath?fuente
Cualquier archivo jar ejecutable debe ejecutarse haciendo clic o ejecutando mediante el símbolo del sistema como java -jar app.jar (use "si la ruta del jar contiene espacio", es decir, java -jar "C: \ nombre de carpeta \ app.jar"). Si su jar ejecutable no se está ejecutando, lo que significa que no se creó correctamente.
Para una mejor comprensión, extraiga el archivo jar (o visualice con cualquier herramienta, para Windows 7-Zip es bueno) y verifique el archivo en /META-INF/MANIFEST.MF. Si encuentras alguna entrada como
Main-Class: your.package.name.ClaaswithMain, entonces está bien, de lo contrario, debe proporcionarlo.
Tenga en cuenta la entrada de clase principal adjunta en el archivo MANIFEST.MF, compruebe dónde la está guardando.
fuente
Simplemente puede seguir este paso Crear un archivo jar usando
Mientras ejecuta el archivo jar, simplemente ejecute así
fuente
Es posible que no haya creado el archivo jar correctamente:
Los siguientes trabajos:
fuente
Si está utilizando la línea de comando para ensamblar .jar, es posible apuntar a main sin agregar el archivo Manifiesto. Ejemplo:
(el parámetro "e" hace eso: TheNameOfClassWithMainMethod es un nombre de la clase con el método main () y app.jar - nombre del ejecutable .jar y * .class - solo todos los archivos de clases para ensamblar)
fuente
Para mí, este error ocurrió simplemente porque olvidé decirle a Eclipse que quería un archivo jar ejecutable y no un simple archivo jar de biblioteca. Entonces, cuando cree el archivo jar en Eclipse, asegúrese de hacer clic en el botón de opción derecho
fuente
Las respuestas anteriores fueron solo parcialmente útiles para mí.
java -cp
era parte de la respuesta, pero necesitaba información más específica sobre cómo identificar la clase a ejecutar. Esto es lo que funcionó para mí:Paso 1: encuentre la clase que necesito ejecutar
Las líneas superiores del resultado fueron:
App.class contenía la clase principal para ejecutar. No estoy 100% seguro de si siempre puedes asumir que la clase que necesitas es la primera, pero fue para mí. Si no es así, me imagino que no es demasiado difícil usar grep para excluir los resultados relacionados con la biblioteca para reducir la lista de clases a un tamaño manejable.
A partir de ahí fue fácil: solo uso esa ruta (menos el sufijo ".class"):
fuente
java -cp ... somepackage.App
.Como ha agregado MANIFEST.MF, creo que debería considerar el orden de Field en este archivo. Mi env es
java version "1.8.0_91"
y mi MANIFEST.MF como aquí
Sin embargo, esto como a continuación se ejecuta a través de
fuente
(primer mensaje, por lo que puede que no esté limpio)
Esta es mi solución para OS X 11.6, el programa Netbeans 8.2 basado en Maven. Hasta ahora, mi aplicación es 100% Netbeans, sin ajustes (¡solo unos pocos escapes de shell para lo imposible!).
Después de haber probado la mayoría de las respuestas aquí y en otros lugares en vano, volví al arte de "usar lo que funciona".
La respuesta principal aquí ( olivier-refalo ) parecía el lugar correcto para comenzar, pero no ayudó.
Al observar otros proyectos que funcionaron, noté algunas diferencias menores en las líneas de manifiesto:
No estoy seguro de por qué (solo llevo 3 meses en Java) o cómo, pero solo puedo decir que esto funcionó.
Aquí está solo el bloque de manifiesto modificado utilizado:
fuente
¡Encontré una nueva solución para la generación de manifiestos malos!
Haga clic para META-INF
Agregar o editar
Añadir:
Cree un archivo de texto llamado MANIFEST.MF en una carpeta llamada META-INF y agregue la siguiente línea:
Guarde el archivo y agréguelo al zip
Editar:
Abra cmd y escriba: java -jar c: /path/JarName.jar
¡Debería funcionar bien ahora!
fuente
la mayoría de las soluciones no funcionaron para mí, pero mi instructor me ayudó, me gustaría compartir su solución aquí, utilicé el terminal kali linux pero debería estar bien en todos los debian
en el tipo de archivo
ahora para ejecutar el uso del archivo
o puede ir a las propiedades del archivo y verificar
me ayudó mientras que la mayoría de las respuestas anteriores no
fuente
Puede que tengas el mismo problema que yo. Después de crear su archivo .jar, escriba
jar xf app.jar META-INF/MANIFEST.MF
. Esto creará una copia del archivo en su directorio actual para que pueda leerlo. Si solo dice algo como:y no contiene la declaración "Main-Class", entonces creo que encontró su problema.
Sin embargo, no sé cómo resolverlo. Verifiqué a otras personas con problemas iguales / similares en StackOverflow y no pude encontrar una respuesta. Sin embargo, con esta información quizás pueda obtener una mejor ayuda (dado el hecho de que tiene el mismo problema que yo).
Editar: había intentado con un archivo de manifiesto pero no lo hice funcionar, pero mi error fue nombrar solo una de las clases al crear el archivo jar. Escribí * .class en su lugar y funciona ahora.
Aunque no sé por qué es necesario crear un archivo de manifiesto. Pero supongo que está bien mientras funcione.
fuente
Tuve este problema y lo resolví recientemente haciendo esto en Netbeans 8 (Consulte la imagen a continuación):
fuente