¿Cómo construir frascos de IntelliJ correctamente?

519

Tengo un proyecto que contiene un solo módulo y algunas dependencias. Me gustaría crear un jar, en un directorio separado, que contenga el módulo compilado. Además, me gustaría tener las dependencias presentes al lado de mi módulo.

No importa cómo gire el proceso "build jar" de IntelliJ, la salida de mi módulo aparece vacía (además de un archivo META-INF).

ripper234
fuente

Respuestas:

603

Aquí se explica cómo construir un jar con IntelliJ 10 http://blogs.jetbrains.com/idea/2010/08/quickly-create-jar-artifact/

File-> Project Structure-> Project Settings-> Artifacts-> Haga clic en green plus sign-> Jar->From modules with dependencies...

Lo anterior establece el "esqueleto" donde se guardará el frasco. Para construirlo y guardarlo, haga lo siguiente:

Extraer al frasco objetivo

Okay

Construir | Construir artefacto | Construir

Intente extraer el archivo .jar de

NombreDeProyecto | fuera | artefactos | ProjectName_jar | ProjectName.jar

EpicPandaForce
fuente
99
Falla cuando algunas clases en su jar incluido están firmadas con RSA.
Asif Shahzad
1
@AsifShahzad vea esta respuesta para construir archivos jar con dependencias firmadas: stackoverflow.com/questions/41746177/… .
55
Este método aún falla, el archivo jar no se ejecuta
samuel owino
66
Parece que alguien realmente ha trabajado muy duro para que no funcione. Es una pena que nunca funcione. He intentado al menos 50 respuestas diferentes y ninguna funcionó. Y es la misma historia cada vez. Ahora reservo una semana para simplemente sacarlo como un frasco, ya que todos en nuestra empresa piensan que es un esfuerzo genuino que debe realizarse para producir un frasco de salida.
Impresionante
2
Como muchos escribieron antes que yo, esta es una simplificación que a veces funciona. Consulte la respuesta de @zsolt tolvali a continuación. Sería bueno desde la perspectiva de IntelliJ hacer que el proceso de creación de JAR sea una ACTIVIDAD POR DEFECTO al crear un nuevo proyecto, ¡porque muy pocas personas no lo necesitan!
Etamar Laron
256

Esto sigue siendo un problema en 2017, ¡espero que ayude a alguien por ahí! Encontré 2 posibilidades para crear jar-s de trabajo en IntelliJ 2017.2

1. Crear artefactos desde IntelliJ:

  • Ir a la estructura del proyecto:

Menú Archivo

  • Crea un nuevo artefacto:

Crea un nuevo artefacto

  • Seleccione la clase principal y asegúrese de cambiar la carpeta de manifiesto:

ingrese la descripción de la imagen aquí

Tienes que cambiar el directorio de manifiesto:

<project folder>\src\main\java 

reemplazar "java" con "recursos"

<project folder>\src\main\resources

Así es como debería verse:

forma correcta para nuevo manifiesto

  • Luego eliges las dependencias que quieres que se empaqueten en tu jar, o CERCA de tu archivo jar

  • Para construir su artefacto, vaya a construir artefactos y elija "reconstruir". Creará una carpeta "fuera" con su archivo jar y sus dependencias.

ingrese la descripción de la imagen aquí

2. Usando maven-assembly-plugin

Agregar sección de compilación al archivo pom

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <finalName>ServiceCreate</finalName>
                    <appendAssemblyId>false</appendAssemblyId>
                    <archive>
                        <manifest>
                            <mainClass>com.svt.optimoo.App</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
  • Cree una nueva configuración de ejecución / depuración:

Cree una nueva configuración de ejecución / depuración:

  • Elegir aplicación:

Elegir aplicación

  • Rellene el formulario
  • Agregue el objetivo maven "ensamblado: único" después de la compilación para ejecutarlo en último lugar

ingrese la descripción de la imagen aquí

Configuración final

  • Guárdalo, luego corre

ingrese la descripción de la imagen aquí

Este procedimiento creará el archivo jar en la carpeta "target"

Ubicación del archivo JAR

Zsolt Tolvaly
fuente
77
¡cambiar el directorio de manifiesto a src / resources es el punto clave! gracias ~
fantouch
3
Esta ruta MANIFEST es la más crítica, gracias @Zsolt Tolvaly
fruqi
2
Estaba no main manifest attributeadoptando las soluciones anteriores. Nadie ha mencionado cambiar el path to manifest. Thnx !!
Prometeo
1
Esta debería ser la mejor respuesta. ¡Gracias!
Giorgos Lamprakis
¿qué tal el código fuente en scala? Java no es lo que estoy usando
Kiwy
135

Recientemente tuve este problema y creo que estos pasos son fáciles de seguir si faltan detalles en alguna solución o enlace anterior.

Cómo crear un .jaruso de IntelliJ IDEA 14.1.5:

  1. Archivo> Guardar todo.
  2. Ejecute el controlador o la clase con el método principal.
  3. Archivo> Estructura del proyecto.
  4. Seleccione la pestaña "Artefactos".
  5. Haga clic en el botón verde más cerca de la parte superior de la ventana.
  6. Seleccione JAR del menú desplegable Agregar. Seleccione "De módulos con dependencias"
  7. Seleccionar clase principal.
  8. El botón de radio debe seleccionar "extraer al JAR de destino". Presiona OK.
  9. Marque la casilla "Construir en hacer"
  10. Presione aplicar y OK.
  11. Desde el menú principal, seleccione el menú desplegable de compilación.
  12. Seleccione la opción construir artefactos.
usuario5442490
fuente
1
te perdiste algo? Hay una opción sobre el módulo que debería ser eso. En mi caso, está creando JAR pero JVM por error debido a la seguridad.
sonus21
Creo que esa lista lo es todo. Es posible que tenga algo con su configuración de Java que lo detiene debido a la seguridad. ¿Alguien más tiene pensamientos sobre esto?
user5442490
Seguí lo mismo y tengo un error: No se pudo encontrar o cargar la clase principal JavaFundamentals.jar al ejecutar este archivo jar. Explicado aquí: stackoverflow.com/questions/40636790/…
laggerok19
¿Es necesario realizar este proceso de 12 pasos cada vez que quiero construir un jar, o IntelliJ recordará estas acciones para que pueda usar un acceso directo?
Andy
31

Para aquellos que se benefician de las imágenes como lo hago yo:

File -> Project Structure

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Crt
fuente
44
@ Samuelowino, no aprecio que digas eso. Explica lo que "no funciona en absoluto".
Crt
1
Hola @Crt No estaba revisando el archivo jar correcto, aparentemente, Inteliji produjo dos archivos jar en diferentes directorios, disculpas, mi problema, su solución funciona, gracias
samuel owino
15

Aquí hay 2 ejemplos con el proyecto Maven, paso a paso:

Método 1: Construye jar con maven y pom.xml

  1. Archivo, nuevo, proyecto, maven
  2. crear un paquete, crear un programa java dentro de ese paquete ingrese la descripción de la imagen aquí
  3. en pom.xml, agregue maven-jar-plugin.

        <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>somePackage.sample</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

captura de pantalla: ingrese la descripción de la imagen aquí 4. abra el cuadro del proyecto maven haciendo clic en el icono de búsqueda y escriba maven, ingrese la descripción de la imagen aquí

  1. haga clic en limpiar, luego haga clic en instalar ingrese la descripción de la imagen aquí

  2. su archivo jar aparecerá dentro de la carpeta de destino ingrese la descripción de la imagen aquí

  3. prueba tu jar usando java -jar

ingrese la descripción de la imagen aquí

Método 2: construir jar con maven sin cambio pom.xml

  1. Archivo, nuevo, proyecto, maven
  2. crear un paquete, crear un programa java dentro de ese paquete (igual que el anterior)
  3. File-> Project Structure-> Project Settings-> Artifacts-> Haga clic en green plus sign-> Jar->From modules with dependencies

¡Muy importante!

El MANIFEST.MF debe estar en su carpeta de recursos y el Main.Class debe referirse a {paquete} - {nombre-clase-que-contiene-clase-principal}

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

  1. luego haga clic en construir en el menú, construir artefactos, construir

ingrese la descripción de la imagen aquí

  1. encuentra el frasco en la carpeta de salida

ingrese la descripción de la imagen aquí

  1. ejecutarlo :)

ingrese la descripción de la imagen aquí

rrr
fuente
esto funciona. ¿Puede explicar por qué MANIFEST.MF necesita estar en ese directorio?
Ubeogesh
Esto me ayuda
Devendra Singraul
5

Probablemente sea un poco tarde, pero logré resolverlo de esta manera -> abrir con winrar y eliminar ECLIPSEF.RSA y ECLIPSEF.SF en la carpeta META-INF, además puse "Main-class: main_class_name" (sin ".class" ) en MANIFEST.MF. Asegúrese de presionar "Enter" dos veces después de la última línea, de lo contrario no funcionará.

Baka
fuente
Para dependencias firmadas, eche un vistazo a esta respuesta: stackoverflow.com/questions/41746177/…
Qué problema tan loco. ¿Alguna idea de por qué sucede esto o cómo solucionarlo? Esto se siente hacky
Andrew No
5

Cuando uso esta solución, aparece este error:

java -jar xxxxx.jar

sin atributo manifiesto principal, en xxxxx.jar

y la solución es :

Tienes que cambiar el directorio de manifiesto:

<project folder>\src\main\java 

cambiar java a recursos

<project folder>\src\main\resources
Saeed
fuente
¡Por fin, gracias por la sugerencia!
rendon
@rendon ¡Buena suerte!
Saeed
Perfecto !. Esto funciona bien
jafarmlp
2

Estaba tratando de construir un jar desde una aplicación Kotlin de varios módulos y recibía el notorio error 'sin atributo de manifiesto principal'. Crear el directorio de manifiesto src/main/resourcestampoco funcionó.

En cambio, funciona al crear en srcdirecto: src/META-INF/MANIFEST.MF.

ingrese la descripción de la imagen aquí

Tobias Uhmann
fuente
Hola, gracias, está funcionando bien. Pero ahora tengo un nuevo error que no está encontrando los recursos "java.desktop / javax.swing.ImageIcon java.lang.NullPointerException"
Shivam Mathur
2

ingrese la descripción de la imagen aquí

Como dice la gente de arriba, pero tengo que señalar un punto. Tienes que marcar la casilla de verificación:

Incluir en la construcción del proyecto

Benchur Wong
fuente
1

Idea 8.1.3

Jar está bien, ya que hay una salida compilada en el directorio 'output' (project / out / production //)

Supongo que tienes que ejecutar 'make' antes de construir jar

para las dependencias simplemente marque "mostrar biblioteca" y elija lo que desee.

Vugluskr
fuente
1

Con Maven puedes usar este complemento:

 <build>
    <plugins>

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>[path you class main]</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase> 
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
fede beron
fuente
0

Es posible que desee echar un vistazo a Maven ( http://maven.apache.org ). Puede usarlo como el proceso de compilación principal para su aplicación, o simplemente para realizar ciertas tareas a través del cuadro de diálogo Editar configuraciones. El proceso de crear un JAR de un módulo dentro de Maven es bastante trivial, si desea que incluya todas las dependencias en un JAR autoejecutable que también es trivial.

Si nunca has usado Maven antes, entonces quieres leer Mejores construcciones con Maven .

Gary Rowe
fuente
8
Maven obviamente está sobrecargado para tareas simples como crear jar. Tal vez Ant pero no maven seguro.
Juriy
Link está muerto (octubre de 2014)
KathyA.
1
@KathyA. Gracias, actualizado para usar las recomendaciones del equipo de Maven.
Gary Rowe
55
Si es tan trivial, ¿por qué no incluirlo en su respuesta?
nuzzolilo
1
Porque deseo que el lector visite el sitio y comience el proceso de aprendizaje.
Gary Rowe
0

Si está utilizando bibliotecas de terceros con su proyecto o si tiene problemas para crear el archivo MANIFEST.MF correctamente, puede haber conflictos al ejecutar archivos JAR generados utilizando

File > Project Structure > Artifacts > '+' > JAR > From modules with dependencies > .....

método mencionado anteriormente.

En cambio, le sugiero que cree un JAR vacío y agregue todos los demás elementos a la raíz de salida manualmente. Puede encontrar un maravilloso artículo de blog para este método aquí: http://karthicraghupathi.com/2016/07/10/creating-an-executable-jar-in-intellij-idea/ Intenté los pasos mencionados allí y todo funcionó bien ¡para mi!

Thilina Ceniza Gamage
fuente
Gracias, esto me ayudó! Parece haber un error en Intellij donde el manifiesto del proyecto se sobrescribe en el JAR por un manifiesto predeterminado si selecciona "JAR" como tipo de artefacto en lugar de "Otro".
rojo el
0

Algunas de las otras respuestas son inútiles porque tan pronto como vuelva a importar el proyecto IntelliJ IDEA del proyecto maven, todos los cambios se perderán.

La construcción del jar debe ser desencadenada por una configuración de ejecución / depuración, no por la configuración del proyecto.

Jetbrains tiene una buena descripción de cómo puedes lograr esto aquí:

https://www.jetbrains.com/help/idea/maven.html

Desplácese hacia abajo a la sección llamada "Configuración de disparadores para objetivos Maven".

(La única desventaja de su descripción es que sus capturas de pantalla están en el esquema de color negro sobre blanco predeterminado en lugar del tema súper impresionante Darcula. ¡Uf!)

Entonces, básicamente, lo que haces es que abres el panel "Proyectos Maven", encuentras el proyecto de interés, (en tu caso, el proyecto que construye tu jar), debajo de él encuentras el objetivo Maven que deseas ejecutar , (por lo general, el objetivo del "paquete" crea frascos), abre el menú contextual (haga clic con el botón derecho en una máquina con Windows) y aparecerá la opción "Ejecutar antes de ejecutar / depurar ..." selecciona y te llevará de la mano desde allí. Realmente fácil.

Mike Nakis
fuente
0

En caso de que intente crear un jar con kotlin, debe crear una src/main/javacarpeta y usar esta carpeta como ubicación para la carpeta META-INF.

Chris
fuente
0

Aquí está la respuesta oficial de la Ayuda IntelliJ IDEA 2018.3 . Lo intenté y funcionó.

Para construir un archivo JAR desde un módulo;

  1. En el menú principal, elija Construir | Construir artefacto.

  2. En la lista desplegable, seleccione el artefacto deseado del tipo JAR. La lista muestra todos los artefactos configurados para el proyecto actual. Para construir todos los artefactos configurados, elija la opción Construir todos los artefactos.

Sabri Meviş
fuente
0

Mi problema fue este: utilicé Intellij IDEA (probé diferentes versiones) + Gradle. Cuando compilé el proyecto y construí el jar artifacf, como se indica en las respuestas anteriores, recibí un error: "no hay atributo principal manifiesto ..."

Esta solución funcionó para mí (un agradecimiento especial a Thilina Ashen Gamage (ver arriba) para obtener una sugerencia):

Extracto: si usa bibliotecas externas y crea un proyecto a través de Configuración del proyecto - Artefactos - Agregar (+) - Jar - De los módulos con dependencias , entonces probablemente debido a un error del programa, la carpeta META-INF con el archivo MANIFEST_MF no incluye jar. Para evitarlo, cree un archivo jar VACÍO .

Configuración del proyecto - Artefactos - Añadir (+) - tarro - frasco vacío . La carpeta META-INF se agregará a la carpeta de recursos . Luego selecciona tu clase principal. Verá la siguiente estructura jar: tenga en cuenta la presencia de una carpeta META-INF Observe la presencia de una carpeta META-INF. Luego puede construir su proyecto y construir artefactos. Esta solución también funcionó para aplicaciones javaFX.

Orkhan Hasanli
fuente
-1

Si está trabajando en el proyecto spring / mvn, puede usar este comando:

mvn package -DskipTests

El archivo jar se guardará en el directorio de destino.

Hans Pour
fuente
-3

Ant y Maven son ampliamente utilizados. Prefiero Ant, siento que es más liviano y que el desarrollador tiene más control. Algunos sugerirían que es su desventaja :-)

Brian
fuente
3
Esto no explica por qué está ocurriendo el error.
baordog 01 de