Pregunta sobre jar, intellij-idea, build-process, java – ¿Cómo construir frascos desde IntelliJ correctamente?

403

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 junto a 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).

O, ¡crearías un lenguaje que no sea tan complicado! Oh, espera ... La gente ya hizo eso. devinbost
De hecho, la característica se esconde un poco. Debe establecerse de forma predeterminada o, al menos, colocarse en una ubicación primaria al crear un nuevo proyecto. Etamar Laron
Es increíble lo corto que puede ser un IDE en estos días. ¡Esto es mucho trabajo para crear un JAR! SteelToe
Las computadoras son para la automatización. Si no te gusta una tarea en un mundo de software, escribes un script y lo pones en tu RUTA para el futuro brillante jajaja ed22
Esto no debería ser difícil ... Es realmente agravante que algo tan básico se convierta en una tarea. Me encanta Java, pero este tipo de cosas nunca es tan complicado en ningún otro idioma. Steve the Maker

Tu respuesta

17   la respuesta
0

Cuando yo usoestas soluciones este error viene

java -jar xxxxx.jar

sin atributo de 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
-4

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

Esto no hace nada para explicar por qué está ocurriendo el error. baordog
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 poner "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á.

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

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. Creando artefacto desde IntelliJ:

Ir a la estructura del proyecto:

Crea un nuevo artefacto:

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

Tienes que cambiar el directorio de manifiesto:

<project folder>\src\main\java 

Reemplace "java" con "recursos"

<project folder>\src\main\resources

Así es como debería verse:

Luego elige las dependencias en las que desea empaquetar EN su archivo jar o CERCA de su archivo jar

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

2. Usando el plugin de montaje de maven

Añadir 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>
Crear una nueva configuración de ejecución / depuración:

Elija la aplicación:

Rellene el formularioAgregue el objetivo de Maven "ensamblado: único" después de la compilación que se ejecutará en último lugar

Guárdalo, luego corre

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

Esto funcionó para mí. Esta debería ser la respuesta aceptada. Norbert Bicsi
El segundo enfoque es bueno y funciona. deep
Esta ruta MANIFEST es la más crítica, gracias @Zsolt Tolvaly fruqi
Yo estaba consiguiendono main manifest attribute adoptando las soluciones anteriores. Nadie ha mencionado cambiar elpath to manifest. Gracias !! Prometheus
0

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

Para construir un archivo JAR desde un módulo;

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

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

27

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

Archivo -> Estructura del proyecto

@samuelowino no aprecio que digas eso. Explica qué "no funciona en absoluto". Crt
Hey @Crt No estaba revisando el archivo jar correcto, aparentemente, Inteliji produjo dos archivos jar en directorios diferentes, disculpas, mi problema, su solución funciona, gracias samuel owino
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 dependencias simplemente marque "Mostrar biblioteca" y elija lo que quiere.

1

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 sea trivial.

Si nunca has usado Maven antes, entonces quieres leer.Mejor construye con Maven.

Si es tan trivial, ¿por qué no incluirlo en tu respuesta? nuzzolilo
Maven obviamente está encima de una tarea simple como crear un jar. Tal vez Ant, pero no es seguro, seguro. Juriy
El enlace está muerto (octubre de 2014) KathyA.
Porque deseo que el lector visite el sitio y comience el proceso de aprendizaje. Gary Rowe
@KathyA. Gracias - actualizado para usar las recomendaciones del equipo de Maven. Gary Rowe
468

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

Archivo -> Estructura del proyecto -> Configuración del proyecto -> Artefactos -> Haga clic en el signo más verde -> Frasco -> Desde módulos con dependencias ...

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

Extraer al tarro objetivo.

DE ACUERDO

Construir | Construir artefacto

Link está muerto. ¿Tienes una copia de este artículo? James Schek
Como muchos escribieron antes que yo, esta es una simplificación que a veces funciona. Por favor vea 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
Sigo trabajando para 2017.2 Rich Cowin
Para mí, funcionó en 2016.2.1, pero primero debes marcar la marca "Construir en make" en el menú donde configuras el directorio de salida, luego debes ejecutar la aplicación en Intellij para que genere el archivo jar. sgirardin
0

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

Esta solución funcionó para mí (gracias especiales a Thilina Ashen Gamage (ver arriba) por la sugerencia):

Extracto: si utiliza bibliotecas externas y crea un proyecto a través deConfiguración del proyecto - Artefactos - Agregar (+) - Frasco - Desde módulos con dependencias, entonces, probablemente debido a un error en el programa, la carpeta META-INF con el archivo MANIFEST_MF no se incluye en el archivo jar. Para evitarlo se crea.VACÍO archivo jar

Configuración del proyecto - Artefactos - Agregar (+) - Frasco - TARRO VACÍO. La carpeta META-INF se agregará arecursos carpeta. Luego selecciona tu clase principal. Verás la siguiente estructura de tarro: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.

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 con

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

método mencionado anteriormente.

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

Gracias, esto me ayudó! Parece que hay un error en Intellij donde el manifiesto del proyecto se sobrescribe en el JAR mediante un manifiesto predeterminado si selecciona "JAR" como el tipo de artefacto en lugar de "Otro". red
1

Con Maven puedes usar este plugin:

 <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>
127

Hace poco 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.jar utilizando IntelliJ IDEA 14.1.5:

Archivo> Guardar todo.Ejecute el controlador o la clase con el método principal.Archivo> Estructura del proyecto.Seleccione la pestaña "Artefactos".Haga clic en el botón verde más cerca de la parte superior de la ventana.Seleccione JAR en el menú desplegable Agregar. Seleccione "Desde módulos con dependencias".Seleccione la clase principal.El botón de opción debe seleccionar "extraer al JAR de destino". Presiona OK.Marque la casilla "Construir sobre marca"Presione aplicar y OK.En el menú principal, seleccione la lista desplegable de compilación.Seleccione la opción construir artefactos.
¿Se debe seguir este proceso de 12 pasos cada vez que quiero crear un frasco o IntelliJ recordará estas acciones para que pueda usar un acceso directo? Andy
Creo que esa lista lo es todo. Es posible que tenga algo con la configuración de java que lo detenga debido a la seguridad. ¿Alguien más tiene pensamientos sobre esto? user5442490
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
Seguí lo mismo y tengo Error: No se pudo encontrar o cargar la clase principal JavaFundamentals.jar al ejecutar este archivo jar. Explicado aquí:stackoverflow.com/questions/40636790/… laggerok19
3

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

Método 1: Construir jar con maven y pom.xmlArchivo, nuevo, proyecto, mavencrear un paquete, crear un programa java dentro de ese paquete

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>

la captura de pantalla:4. Abra el cuadro del proyecto Maven haciendo clic en el icono de búsqueda y escriba Maven,

haga clic en limpiar, luego haga clic en instalar

tu archivo jar aparecerá dentro de la carpeta de destino

prueba tu tarro usando java -jar

Método 2: construir el frasco con maven sin cambiar pom.xmlArchivo, nuevo, proyecto, mavencrear un paquete, crear un programa java dentro de ese paquete (igual que arriba)Archivo -> Estructura del proyecto -> Configuración del proyecto -> Artefactos -> Haga clic en el signo más verde -> Frasco -> Desde módulos con dependencia¡Muy importante!

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

a continuación, haga clic en construir en el menú, crear artefactos, compilar

encuentra el frasco en la carpeta de salida

ejecutarlo :)

0

En caso de que esté intentando construir un tarro con kotlin, necesita crear unsrc/main/java y utilice esta carpeta como ubicación para la carpeta META-INF.

0

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.

0

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

La construcción del jar debe ser activada 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 hasta la sección llamada "Configuración de desencadenantes para los objetivos de Maven".

(La única desventaja de su descripción es que sus capturas de pantalla se encuentran en el esquema de color negro sobre blanco predeterminado en lugar del súper impresionante tema de la déctula. ¡Ugh!)

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

Preguntas relacionadas