Hasta ahora, creé archivos JAR ejecutables a través de la funcionalidad "Exportar ..." de Eclipse, pero ahora cambié a IntelliJ IDEA y Gradle para la automatización de compilación.
Algunos artículos aquí sugieren el complemento de "aplicación", pero esto no conduce completamente al resultado que esperaba (solo un JAR, sin scripts de inicio ni nada parecido).
¿Cómo puedo lograr el mismo resultado que Eclipse con el cuadro de diálogo "Exportar ..."?
Las respuestas de JB Nizet y Jorge_B son correctas.
En su forma más simple, crear un JAR ejecutable con Gradle es solo cuestión de agregar las entradas apropiadas al manifiesto . Sin embargo, es mucho más común tener dependencias que deben incluirse en el classpath, lo que hace que este enfoque sea complicado en la práctica.
El complemento de aplicación proporciona un enfoque alternativo; en lugar de crear un JAR ejecutable, proporciona:
run
tarea para facilitar la ejecución fácil de la aplicación directamente desde la compilacióninstallDist
tarea que genera una estructura de directorio que incluye el JAR integrado, todos los JAR de los que depende y un script de inicio que reúne todo en un programa que puede ejecutardistZip
ydistTar
tareas que crean archivos que contienen una distribución completa de la aplicación (scripts de inicio y JAR)Un tercer enfoque es crear el llamado "JAR gordo", que es un JAR ejecutable que incluye no solo el código de su componente, sino también todas sus dependencias. Hay algunos complementos diferentes que utilizan este enfoque. He incluido enlaces a algunos que conozco; Estoy seguro de que hay más.
fuente
configurations.runtime
a las dependencias de tiempo de ejecución del paquete en el jar individual..tar
/.zip
generados?Como otros han señalado, para que un archivo jar sea ejecutable, el punto de entrada de la aplicación debe establecerse en el
Main-Class
atributo del archivo de manifiesto. Si los archivos de clase de dependencia no están colocados, entonces deben establecerse en laClass-Path
entrada del archivo de manifiesto.He intentado todo tipo de combinaciones de complementos y, además de la simple tarea de crear un jar ejecutable y de alguna manera, incluir las dependencias. Parece que faltan todos los complementos de una forma u otra, pero finalmente lo obtuve como quería. Sin scripts misteriosos, ni un millón de mini archivos diferentes que contaminan el directorio de compilación, un archivo de scripts de compilación bastante limpio y, sobre todo: ni un millón de archivos de clases de terceros extranjeros fusionados en mi archivo jar.
Lo siguiente es copiar y pegar desde aquí para su conveniencia.
[Cómo hacer] crear un archivo zip de distribución con tarros de dependencias en el subdirectorio
/lib
y agregar todas las dependencias a laClass-Path
entrada en el archivo de manifiesto:Alojado como una esencia aquí .
El resultado se puede encontrar en
build/distributions
y el contenido descomprimido se ve así:Contenido de
MyJarFile.jar#META-INF/MANIFEST.mf
:fuente
lib
directorio del archivo zip / tar producido, sino que estaba enlib
el directorio padre, como sugiere esta respuesta. Esta solución pareció funcionar perfectamente para mí."lib/$it.name"
a"$it.name"
hará el trabajo.La solución de menor esfuerzo para mí fue hacer uso de complemento gradle-shadow-plugin
Además de aplicar el complemento, todo lo que hay que hacer es:
Configure la tarea jar para poner su clase Main en manifiesto
Ejecute la tarea gradle
Tome la versión de la aplicación all.jar de build / libs /
Y finalmente ejecutarlo a través de:
fuente
build.gradle
.'com.my.app.MainKt'
. Sin más información, no puedo ayudarte más.¿Has probado la tarea 'installApp'? ¿No crea un directorio completo con un conjunto de scripts de inicio?
http://www.gradle.org/docs/current/userguide/application_plugin.html
fuente
installApp
no crea unMETA-INF/MANIFEST.MF
archivo. ¿Estoy haciendo algo mal?installApp
tarea en la lista de tareas del complemento de aplicación . ¿Quiso decir en suinstallDist
lugar?installApp
se le cambió el nombre ainstallDist
en Gradle 3.0. Aquí está la nota de lanzamiento .Gracias Konstantin, funcionó de maravilla con pocos matices. Por alguna razón, especificar la clase principal como parte del manifiesto jar no funcionó del todo y quería el atributo mainClassName. Aquí hay un fragmento de build.gradle que incluye todo para que funcione:
Después de ejecutar gradle shadowJar, obtienes myapp- {versión} -all.jar en tu carpeta de compilación que se puede ejecutar como java -jar myapp- {versión} -all.jar.
fuente
Puede definir un artefacto jar en la configuración del módulo (o estructura del proyecto).
Hacer un frasco es tan fácil como hacer clic en "Crear artefacto ..." en el menú Crear. Como beneficio adicional, puede empaquetar todas las dependencias en un solo jar.
Probado en IntelliJ IDEA 14 Ultimate.
fuente
Revisé algunos enlaces para la solución, finalmente hice los pasos mencionados a continuación para que funcione. Estoy usando Gradle 2.9.
Realice los siguientes cambios en su compilación, archivo gradle:
Mencione el complemento:
Proporcione el Buildscript:
Proporcionar la clase principal:
Crea el fatjar:
Ejecute el fatjar desde / build / libs /:
fuente
Puede usar el complemento SpringBoot:
Crea el frasco
Y luego ejecutarlo
Nota: su proyecto NO necesita ser un proyecto SpringBoot para usar este complemento.
fuente