java - for - “No hay atributo de manifiesto principal” en----. Netbeans jar
no hay ningún atributo de manifiesto principal en jar maven (6)
Espero que haya un problema en su archivo manifiesto. Algunas comprobaciones básicas podrían resolver su problema.
- Debería estar bajo
/META-INF/MANIFEST.MF
- El contenido debe tener
Main-Class:com.MyCompany.App
Si está utilizando cualquier IDE, debería haber una opción para exportar el proyecto como un runnable jar
, puede utilizarlo para que el IDE se encargue del manifiesto correcto.
Desde la línea de comandos jar cfm filename.jar Manifest.txt com/MyCompany/*.class
que genera el archivo Manifest con el siguiente contenido
Manifest-Version: 1.0
Created-By: 1.6.0 (Sun Microsystems Inc.)
Main-Class: com.MyCompany.App
Y luego puede ejecutar el comando jar java -jar fileName.jar
.
Este tipo de problemas es trivial pero mata mucho tiempo, solo asegúrese de que su contenido y la ubicación del archivo sean correctos.
Recientemente empecé a jugar con Maven en Java. Llego el momento de probar mi proyecto, funciona bien en la ventana de NetBeans, ejecutando la clase principal que se encuentra en App.java (com.MyCompany.App), pero cuando intento ejecutarlo desde una línea de comandos, aparece un error:
java -jar fileName.jar
"No hay atributo de manifiesto principal" en fileName.jar
He intentado agregar un archivo manifest.mf especificando qué es main, también he estado en las propiedades del proyecto y lo agregué como archivo principal ...
¿Que esta pasando?
Establecer un punto de entrada con la herramienta JAR:
La bandera ''e'' (para ''punto de entrada'') crea o anula el atributo de clase principal del manifiesto. Se puede utilizar al crear o actualizar un archivo JAR. Úselo para especificar el punto de entrada de la aplicación sin editar o crear el archivo de manifiesto. Por ejemplo, este comando crea app.jar donde el valor del atributo Main-Class en el manifiesto se establece en MyApp:
jar cfe app.jar MyApp MyApp.class
Puedes invocar directamente esta aplicación ejecutando el siguiente comando:
java -jar app.jar
Si el nombre de la clase entrypoint está en un paquete, puede usar un ''.'' (punto) carácter como delimitador. Por ejemplo, si Main.class está en un paquete llamado foo, el punto de entrada se puede especificar de las siguientes maneras:
jar cfe Main.jar foo.Main foo/Main.class
He tenido este problema con Netbeans 8.0 y el proyecto Maven incorporado para el prototipo del proyecto "Aplicación Java". También tengo Maven 3 y encontré que algunas de las sugerencias en la web no coinciden con el código de Maven utilizado con Netbeans también.
De todos modos, aquí hay una receta simple para tener un archivo JAR para ejecutar las bibliotecas dependientes e integradas de la clase principal. Hice este trabajo comparando otros archivos POM de proyecto para los proyectos que encontré que funcionaron con los subproyectos JAR-s, por lo que si alguien con mejor conocimiento de Maven descubre un gottcha , por favor, hable. Además, me fui en algunas cosas normales para proporcionar contexto. El siguiente ejemplo:
<properties>
<packageName>trials.example</packageName>
<mainClass>${packageName}.CmdApp</mainClass>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<slf4jVersion>1.7.7</slf4jVersion>
<log4jVersion>1.2.17</log4jVersion>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
Esta sección le dice a Maven sobre el proyecto.
- packageName ... es el paquete de Java para la clase principal
- mainClass ..... El nombre completo para la clase con el método main ().
Verás estos usados en el plugin maven-jar.
La otra cosa que el prototipo de ejemplo incorporado no hizo fue empaquetar mis subproyectos en el JAR para que pueda ejecutarme desde la línea de comandos. Esto se hace con el complemento de dependencia de maven a continuación. Lo interesante está en el lugar en el que no necesitamos empaquetar las cosas del sistema, y queremos que las clases dependientes se incluyan en nuestro JAR.
Estos se utilizan de la siguiente manera:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<excludeScope>system</excludeScope>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.5</version>
<configuration>
<useDefaultManifestFile>true</useDefaultManifestFile>
<archive>
<manifest>
<mainClass>${mainClass}</mainClass>
<packageName>${packageName}</packageName>
<addClasspath>true</addClasspath>
<classpathPrefix>classes/</classpathPrefix>
</manifest>
<manifestEntries>
<mode>development</mode>
<url>${pom.url}</url>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Espero que te ahorre las pocas horas de comprobación y prueba para que esto ocurra. Saludos, Will.
Puedes usar esto para la línea de comandos:
java -cp jarFileName.jar full.package.className
No tendría que entrar en detalles del archivo Manifest en este caso.
Sé que esta es una vieja pregunta pero en caso de que ayude a alguien.
Necesita el plugin maven-jar (ver el ejemplo de Maven ). Este complemento creará las entradas necesarias que Rp ha mencionado en el archivo de manifiesto cuando se construye el proyecto.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Necesitas la versión, de lo contrario, el proyecto no se construye. El archivo full.qualified.MainClass comienza en la jerarquía del paquete.
Si observa el cuadro de diálogo de propiedades del proyecto (desde la pestaña Proyecto, haga clic con el botón derecho en su proyecto y seleccione Propiedades) verá que hay un elemento "ejecutar" en la ventana "Categorías". Haga clic en él y verá un cuadro de diálogo donde puede especificar la clase principal para el tarro. Esa información terminará en tu manifiesto.