java - Wrong Manifest.mf en IntelliJ IDEA creado.jar
intellij-idea optaplanner (7)
Intento empaquetar un proyecto utilizando las bibliotecas OptaPlanner 6.0.1 en un .jar a través del artefacto jar de IntelliJ IDEA pero en lugar de mi manifest.mf que contiene el estándar
Manifest-Version: 1.0
Main-Class: a.b.c.app
el jar utiliza el proporcionado en ecj-3.7.2.jar, una de las bibliotecas de soporte de OptaPlanner:
Manifest-Version: 1.0
Build-Jdk: 1.6.0_26
Built-By: ibrandt
Created-By: Apache Maven
Archiver-Version: Plexus Archiver
Debido a esto, se "no main manifest attribute, in appname.jar"
error "no main manifest attribute, in appname.jar"
al intentar ejecutar la aplicación. Si reemplazo manualmente el manifiesto en el archivo .jar con el mío, todo funciona correctamente. ¿Hay algo que pueda hacer para arreglar esto?
Guardo las bibliotecas en un directorio / lib separado y se agregaron a la raíz del artefacto jar como Directorio extraído, IntelliJ IDEA es v13.0.1.
Arreglar:
- Archivo> Estructura del proyecto
- En Configuración del proyecto a la izquierda, selecciona "Artefactos"
- Encuentre la definición de JAR en el panel central y selecciónela
- En el panel izquierdo de la pestaña "Diseño de salida", encuentre el archivo jar en la lista y selecciónelo
- En la parte inferior, haga clic en el botón "Usar manifiesto existente" y seleccione el archivo de manifiesto que se encuentra en la fuente de su proyecto.
- Haga clic en Aceptar y ejecute la compilación
Como se señala en el comentario de @rudolf en una de las otras respuestas, una forma de hacerlo (y la única que funcionó para mí en un proyecto importado de Gradle) es crear un contenedor vacío de la siguiente manera:
- Estructura del proyecto -> Artefactos -> + Jar -> Vacío
- El panel central ahora tiene los botones Crear manifiesto y Usar manifiesto existente. Usa uno de estos.
- Tuve dificultades si extraje bibliotecas dependientes con sus propios manifiestos en la raíz de salida, que parecían sobrescribir intermitentemente el nuevo manifiesto creado manualmente. Perplejo con el orden de las operaciones parecía hacerlo funcionar.
ACTUALIZAR:
Esto es definitivamente un error en Idea. Esta respuesta vinculada funciona de manera confiable cuando hay directorios extraídos. En esencia, si encuentra su .idea / JARNAME.xml, agregue agregue el siguiente elemento a la parte superior del elemento <root>
para su jar. Cualquier elemento extraído encima de su nueva copia de archivo que contenga un manifiesto destruirá su nuevo manifiesto.
<element id="directory" name="/META-INF">
<element id="file-copy" path="$PROJECT_DIR$/modulename/src/META-INF/MANIFEST.MF" />
</element>
Hay varias formas de generar archivos ejecutables. El uso de la función de GUI de IntelliJ es una buena manera. Otra forma es utilizar Maven (o de forma similar en gradle, buildr, etc.) que sea amigable para el servidor de construcción:
Es más o menos copiable desde los ejemplos optaplanner maven build:
- El jar del usuario final (optaplanner-examples - *. Jar) debe incluir el classpath de sus dependencias en su manifiesto .
- La secuencia de comandos sh y bat debe ejecutar ese jar con consiguientemente.
Para no tener ningún problema como Manifest, debe tener un directorio llamado "META-INF" en el directorio "src". Entonces, créelo y ponga un archivo llamado "MANIFEST.MF" con los siguientes contenidos:
Manifest-Version: 1.0
Main-Class: <packageName>.Main
¡No se olvide de reemplazar el nombre del paquete que contiene la clase principal de arriba!
Si desea especificar Main Class, debe agregar este complemento a pom.xml:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<mainClass>Form</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Tuve un problema similar.
El problema estaba en el archivo pom.xml.
<archive>
<manifestEntries>
<Dependencies>one.jar,
two.rar,
other.jar
</Dependencies>
</manifestEntries>
</archive>
No sé por qué razón este código funciona en eclipse, pero no en IntelliJ
Esto es correcto.
<archive>
<manifestEntries>
<Dependencies>one.jar, two.rar, other.jar</Dependencies>
</manifestEntries>
</archive>
Manifest.mf funcionó !!!
Espero que esto ayude.
Yo tuve el mismo problema.
Asegúrate de que tu MANIFEST.MF esté en:
src/main/resources/META_INF/
NO
src/main/java/META_INF/