Manifest.mf incorrecto en IntelliJ IDEA creado .jar

102

Estoy tratando de empaquetar un proyecto usando 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 usa el que se proporciona 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, "no main manifest attribute, in appname.jar"ocurre un error 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 solucionar este problema?

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

grudolf
fuente
1
¿Conoce herramientas de construcción como ant, maven o gradle?
MariuszS
Los conozco, pero hasta ahora solo he usado las contrapartes de make y .NET (NAnt, MSBuild). ¿Cuál de ellos debería elegir si la herramienta de construcción de IntelliJ no lo corta?
Grudolf
1
Vote para corregir este problema aquí ,
bigjosh

Respuestas:

260

Yo tuve el mismo problema.

Asegúrese de que su MANIFEST.MF esté en:

src/main/resources/META_INF/

NO

src/main/java/META_INF/
Jamhan
fuente
20
De hecho, esta es la respuesta correcta, parece que Intellij IDEA está perdiendo la carpeta META-INF cuando la plantilla del proyecto es Maven
Kumait
En mi caso tuve que cambiar el diseño de mi proyecto. Anteriormente tenía un proyecto con diseño de maven, pero eliminé el soporte de maven. Recreo un proyecto desde cero y ahora funciona.
Maxence
1
Esto no me funcionó, tuve que mover el archivo Mainfest a la raíz del proyecto.
racs
¿Es maven tan estúpido que coloca este archivo en un directorio incorrecto? : ^)
Daria
@Kumait, el problema sigue ahí en IntelliJ 2017.1.5. Me pregunto si el equipo de JetBrain está al tanto de esto.
fruqi
12

Arreglar:

  1. Archivo> Estructura del proyecto
  2. En Configuración del proyecto a la izquierda, seleccione "Artefactos"
  3. Busque la definición JAR en el panel central y selecciónela
  4. En el panel izquierdo de la pestaña "Diseño de salida", busque el archivo jar en la lista y selecciónelo
  5. En la parte inferior, haz clic en el botón "Usar manifiesto existente" y selecciona el archivo de manifiesto que se encuentra en la fuente de tu proyecto.
  6. Haga clic en Aceptar y ejecute la compilación
Javaru
fuente
3
No hay un botón "Usar manifiesto existente", sin embargo, el archivo de manifiesto en el Diseño de salida apunta a la ubicación correcta (... \ src \ main \ java \ META-INF \ MANIFEST.MF)
grudolf
5
Bien, tuve que eliminar el artefacto jar y volver a crearlo, esta vez como "Vacío" en lugar de "De módulos con dependencias". Obtuve los botones "Crear manifiesto" y "Usar manifiesto existente", apunté a mi manifiesto y bibliotecas leídas y compilaron la salida. Hay dos diferencias con respecto a antes: un META_INF \ MANIFEST.INF ahora se incluye explícitamente en el diseño de salida y el archivo jar parece generarse correctamente. :)
grudolf
Esto no resuelve el problema, al menos para mí. Sin embargo, la respuesta de jamahn funcionó.
Andrew Breksa
Comentario agregado del usuario de baja representación @ ds-justice de la siguiente manera: el comentario anterior de @ grudolf sobre la creación de un Jar vacío fue lo único que funcionó para mí después de varias horas de luchar con un proyecto de Gradle importado. Esta es una pregunta importante, considere volver a publicar su comentario como una respuesta separada.
Shawn Mehan
10

Como se señaló en el comentario de @ grudolf en una de las otras respuestas, una forma de hacer esto (y la única que funcionó para mí en un proyecto Gradle importado) es crear un frasco 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. Utilice uno de estos.
  • Tuve dificultades si extraje bibliotecas dependientes con sus propios manifiestos en la raíz de salida, parecían sobrescribir intermitentemente el nuevo manifiesto creado manualmente. Jugar con el orden de las operaciones parecía hacerlo funcionar.

ACTUALIZAR:

Este es definitivamente un error en Idea. Esta respuesta vinculada funciona de manera confiable cuando hay directorios extraídos. En esencia, encuentra su .idea / JARNAME.xml, agregue el siguiente elemento en la parte superior del <root>elemento para su jar. Cualquier elemento extraído por encima de su nueva copia de archivo que contenga un manifiesto aplastará su nuevo manifiesto.

  <element id="directory" name="/META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/modulename/src/META-INF/MANIFEST.MF" />
  </element>
Otoño
fuente
7

Si desea especificar la clase principal, 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>
usbo
fuente
1

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é funciona este código 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.

marcelocesar
fuente
Tuve esta situación exacta y llegué a la misma conclusión que tú: las nuevas líneas entre los elementos <Dependencias> funcionaron en Eclipse, pero no en Intellij IDEA.
Arion Krause
0

Hay varias formas de generar archivos jar ejecutables. Usar la función GUI de IntelliJ es una buena manera. Otra forma es usar Maven (o de manera similar en gradle, buildr, etc.) que es compatible con el servidor de compilación:

Es más o menos copiable y pegable de los ejemplos de optaplanner maven build:

  1. El jar del usuario final (optaplanner-examples - *. Jar) debe incluir la ruta de clase de sus dependencias en su manifiesto .
  2. La secuencia de comandos sh and bat debe ejecutar ese jar en consecuencia.
Geoffrey De Smet
fuente
0

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 el siguiente contenido:

Manifest-Version: 1.0
Main-Class: <packageName>.Main

¡No olvide reemplazar el nombre del paquete que contiene la clase Main arriba!

Mohsen Abasi
fuente
4
El registro muestra que eliminé el material religioso de su publicación en agosto. Tenga en cuenta que la comunidad ha discutido la posibilidad de agregar temas religiosos a las publicaciones, y la respuesta es que preferiríamos que se dejaran de lado. Sin embargo, puedes agregarlos a tu perfil o avatar.
halfer