Quiero empaquetar mi proyecto en un solo JAR ejecutable para su distribución.
¿Cómo puedo hacer que un proyecto de Maven empaquete todos los JAR de dependencia en mi JAR de salida?
Quiero empaquetar mi proyecto en un solo JAR ejecutable para su distribución.
¿Cómo puedo hacer que un proyecto de Maven empaquete todos los JAR de dependencia en mi JAR de salida?
Respuestas:
y lo ejecutas con
El objetivo de compilación debe agregarse antes del ensamblaje: individual o de lo contrario, el código de su propio proyecto no está incluido.
Ver más detalles en los comentarios.
Comúnmente, este objetivo está vinculado a una fase de construcción para ejecutarse automáticamente. Esto garantiza que el JAR se construya al ejecutar
mvn install
o realizar una implementación / lanzamiento.fuente
mvn clean compile assembly:single
.<appendAssemblyId>false</appendAssemblyId>
en elconfiguration
para evitar el molesto sufijo "-jar-with-dependencies" en el nombrecompile
y estás jodido.Puede usar el complemento de dependencia para generar todas las dependencias en un directorio separado antes de la fase del paquete y luego incluirlo en la ruta de clase del manifiesto:
Alternativamente usar
${project.build.directory}/classes/lib
como OutputDirectory para integrar todos los archivos jar en el jar principal, pero luego deberá agregar un código de carga de clase personalizado para cargar los jar.fuente
${project.build.directory}/classes/lib
comooutputDirectory
para tener un .jar principal con todas las dependencias dentro, pero: ¿cómo agregar un código de carga de clase personalizado para cargar estos tarros? Necesito hacer ejecución de obras como:java -jar main-jar-with-deps.jar
. Es posible ?Escribí en el blog sobre algunas formas diferentes de hacer esto.
Ver Jar ejecutable con Apache Maven (WordPress)
o ejecutable-jar-with-maven-example (GitHub)
Notas
Esos pros y contras son proporcionados por Stephan .
Para implementación manual
Copiar dependencias a un directorio específico
Hacer que el frasco ejecutable y Classpath sean conscientes
En este punto, el
jar
es realmente ejecutable con elementos de classpath externos.Hacer archivos desplegables
El
jar
archivo solo es ejecutable con el...lib/
directorio hermano . Necesitamos crear archivos para implementar con el directorio y su contenido.Ahora tiene
target/${project.build.finalName}.(zip|tar|tar.bz2|tar.gz)
cuál contiene eljar
ylib/*
.Complemento de ensamblaje de Apache Maven
Usted tiene
target/${project.bulid.finalName}-jar-with-dependencies.jar
.Complemento Apache Maven Shade
Usted tiene
target/${project.build.finalName}-shaded.jar
.onejar-maven-plugin
Plugin Spring Boot Maven
Usted tiene
target/${project.bulid.finalName}-spring-boot.jar
.fuente
Tomando la respuesta de Unnsresponded y reformateándola, tenemos:
A continuación, recomendaría hacer de esto una parte natural de su compilación, en lugar de algo a lo que llamar explícitamente. Para hacer de esto una parte integral de su compilación, agregue este complemento a su
pom.xml
y vincúlelo alpackage
evento del ciclo de vida. Sin embargo, un problema es que debes llamar alassembly:single
objetivo si lo pones en tu pom.xml, mientras que llamarías 'ensamblaje: ensamblaje' si lo ejecutas manualmente desde la línea de comandos.fuente
Use el complemento maven-shade-plugin para empaquetar todas las dependencias en un uber-jar. También se puede usar para construir un jar ejecutable especificando la clase principal. Después de intentar usar maven-assembly y maven-jar, descubrí que este complemento se adaptaba mejor a mis necesidades.
Encontré este complemento particularmente útil ya que combina el contenido de archivos específicos en lugar de sobrescribirlos. Esto es necesario cuando hay archivos de recursos que tienen el mismo nombre en los frascos y el complemento intenta empaquetar todos los archivos de recursos
Ver ejemplo a continuación
fuente
Durante mucho tiempo usé el complemento de ensamblaje maven , pero no pude encontrar una solución al problema
"already added, skipping"
. Ahora, estoy usando otro complemento: onejar-maven-plugin . Ejemplo a continuación (mvn package
build jar):Debe agregar el repositorio para ese complemento:
fuente
Puede usar maven-dependency-plugin, pero la pregunta era cómo crear un JAR ejecutable. Hacer eso requiere la siguiente alteración a la respuesta de Matthew Franglen (por cierto, usar el complemento de dependencia toma más tiempo para construir cuando se comienza desde un objetivo limpio):
fuente
Puede usar el complemento maven-shade para construir un súper jar como se muestra a continuación
fuente
Otra opción si realmente desea volver a empaquetar los otros contenidos de JAR dentro de su JAR resultante único es el complemento Maven Assembly . Descomprime y luego vuelve a empaquetar todo en un directorio a través de
<unpack>true</unpack>
. Entonces tendrías un segundo pase que lo convirtió en un JAR masivo.Otra opción es el complemento OneJar . Esto realiza las acciones de reempaquetado anteriores en un solo paso.
fuente
Puede agregar lo siguiente a su pom.xml :
Luego, debe cambiar a través de la consola al directorio, donde se encuentra el pom.xml. Luego debe ejecutar mvn assembly: single y luego su archivo JAR ejecutable con dependencias se construirá con suerte. Puede verificarlo al cambiar al directorio de salida (destino) con cd ./target e iniciar su jar con un comando similar a java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar .
Probé esto con Apache Maven 3.0.3 .
fuente
Revisé cada una de estas respuestas buscando hacer un jar ejecutable que contenga todas las dependencias y ninguna funcionó correctamente. La respuesta es el complemento de sombra, es muy fácil y directo.
Tenga en cuenta que sus dependencias deben tener un alcance de compilación o tiempo de ejecución para que esto funcione correctamente.
Este ejemplo vino de mkyong.com
fuente
plugin
elemento entrapom.xml
debajobuild/plugins
.Podrías combinar el
maven-shade-plugin
ymaven-jar-plugin
.maven-shade-plugin
paquetes de sus clases y todas las dependencias en un solo archivo JAR.maven-jar-plugin
para especificar la clase principal de su jar ejecutable (consulte Configurar el Classpath , capítulo "Hacer ejecutable el jar").Ejemplo de configuración de POM para
maven-jar-plugin
:Finalmente cree el jar ejecutable invocando:
fuente
Ken Liu tiene razón en mi opinión. El complemento de dependencia de Maven le permite expandir todas las dependencias, que luego puede tratar como recursos. Esto le permite incluirlos en el artefacto principal . El uso del complemento de ensamblaje crea un artefacto secundario que puede ser difícil de modificar; en mi caso, quería agregar entradas de manifiesto personalizadas. Mi pom terminó como:
fuente
Debería ser así:
El desempaquetado debe estar en la fase de generación de recursos porque, si está en la fase de paquete, no se incluirá como recursos. Prueba el paquete limpio y lo verás.
fuente
¿Problema con la ubicación del archivo de ensamblaje compartido con maven-assembly-plugin-2.2.1?
Intente usar el parámetro de configuración descriptorId en lugar de los parámetros descriptors / descriptor o descriptorRefs / descriptorRef.
Ninguno de ellos hace lo que necesita: busque el archivo en classpath. Por supuesto, debe agregar el paquete donde reside el ensamblado compartido en el classpath de maven-assembly-plugin (ver a continuación). Si está utilizando Maven 2.x (no Maven 3.x), es posible que necesite agregar esta dependencia en pom.xml padre superior en la sección pluginManagement.
Vea esto para más detalles.
Clase: org.apache.maven.plugin.assembly.io.DefaultAssemblyReader
Ejemplo:
fuente
Para resolver este problema, utilizaremos Maven Assembly Plugin que creará el JAR junto con sus JAR de dependencia en un solo archivo JAR ejecutable. Simplemente agregue la configuración del complemento a continuación en su archivo pom.xml.
Después de hacer esto, no olvide ejecutar la herramienta MAVEN con este comando mvn clean compile assembly: single
http://jkoder.com/maven-creating-a-jar-together-with-its-dependency-jars-into-a-single-executable-jar-file/
fuente
No responderé directamente a la pregunta ya que otros ya lo han hecho antes, pero realmente me pregunto si es una buena idea incrustar todas las dependencias en el propio jar del proyecto.
Veo el punto (facilidad de implementación / uso) pero depende del caso de uso de su proyecto (y puede haber alternativas (ver más abajo)).
Si lo usa completamente independiente, ¿por qué no?
Pero si usa su proyecto en otros contextos (como en una aplicación web, o se deja caer en una carpeta donde se encuentran otros frascos), es posible que tenga duplicados de jar en su classpath (los que están en la carpeta, el que está en los frascos). Tal vez no sea un acuerdo de oferta, pero generalmente evito esto.
Una buena alternativa
De esta manera, al final solo con un manifiesto y un "cargador principal de clases dinámico especial", puede comenzar su proyecto con:
fuente
Para crear un JAR ejecutable desde la línea de comandos, simplemente ejecute el siguiente comando desde la ruta del proyecto:
fuente
pom.xml
caso contrarioError reading assemblies: No assembly descriptors found.
. Eso es lo que me pasa de todos modos.Esta es la mejor manera que encontré:
Con esta configuración, todas las dependencias se ubicarán en
/dependency-jars
. Mi aplicación no tieneMain
clase, solo contextuales, pero una de mis dependencias tiene unaMain
clase (com.myDomain.etc.MainClassName
) que inicia el servidor JMX y recibestart
unstop
parámetro o un parámetro. Entonces con esto pude iniciar mi aplicación así:Espero que sea útil para todos ustedes.
fuente
Comparé los complementos de árbol mencionados en esta publicación. Genere 2 frascos y un directorio con todos los frascos. Comparé los resultados y definitivamente el complemento maven-shade-plugin es el mejor. Mi desafío era que tenía múltiples recursos de primavera que debían fusionarse, así como jax-rs y servicios JDBC. Todos se fusionaron correctamente con el complemento de sombra en comparación con el complemento de ensamblaje maven. En ese caso, el resorte fallará a menos que los copie en su propia carpeta de recursos y los fusione manualmente una vez. Ambos complementos generan el árbol de dependencia correcto. Tuve múltiples ámbitos como prueba, proporcionar, compilar, etc. La prueba y la provista fueron omitidas por ambos complementos. Ambos produjeron el mismo manifiesto, pero pude consolidar las licencias con el complemento de sombra utilizando su transformador. Con el complemento de dependencia de Maven, por supuesto, no lo haces No tengo esos problemas porque los frascos no se extraen. Pero, como algunos otros han señalado, debe llevar uno o más archivos adicionales para que funcione correctamente. Aquí hay un fragmento de pom.xml
fuente
Algo que me funcionó fue:
Tuve un caso extraordinario porque mi dependencia era el sistema uno:
He cambiado el código proporcionado por @ user189057 con los cambios: 1) maven-dependency-plugin se ejecuta en la fase 2 "prepare-package") Estoy extrayendo las clases desempaquetadas directamente a "target / classes"
fuente
Intenté la respuesta más votada aquí, y pude obtener el jar ejecutable. Pero el programa no se ejecutó correctamente. No sé cuál fue la razón. Cuando trato de huir de
Eclipse
, obtengo un resultado diferente pero cuando ejecuto el jar desde la línea de comandos obtengo un resultado diferente (se bloquea con un error de tiempo de ejecución específico del programa).Tenía un requisito similar al OP solo porque tenía demasiadas dependencias (Maven) para mi proyecto. Afortunadamente, la única solución que funcionó para mí fue usarla
Eclipse
. Muy simple y muy directo. Esta no es una solución para el OP, pero es una solución para alguien que tiene un requisito similar pero con muchas dependencias de Maven,1) Simplemente haga clic derecho en la carpeta de su proyecto (en Eclipse) y seleccione
Export
2) Luego seleccione
Java
->Runnable Jar
3) Se le pedirá que elija la ubicación del archivo jar
4) Finalmente, seleccione la clase que tiene el método Principal que desea ejecutar y elija
Package dependencies with the Jar file
y haga clicFinish
fuente
Esto también podría ser una opción, podrás construir tu archivo jar
fuente
Para cualquiera que busque opciones para excluir dependencias específicas del uber-jar, esta es una solución que funcionó para mí:
Por lo tanto, no es una configuración de mvn-assembly-plugin sino una propiedad de la dependencia.
fuente
Ya hay millones de respuestas, quería agregar que no necesita
<mainClass>
si no necesita agregar entryPoint a su aplicación. Por ejemplo, las API pueden no tener necesariamente unmain
método.configuración del complemento maven
construir
verificar
fuente
Añadir a pom.xml:
y
Eso es. El siguiente paquete mvn también creará un tarro gordo adicionalmente, incluyendo todos los tarros de dependencia.
fuente
El complemento de ensamblaje maven funcionó muy bien para mí. Pasé horas con el complemento de dependencia de maven y no pude hacerlo funcionar. La razón principal fue que tuve que definir en la sección de configuración explícitamente los elementos de artefactos que deberían incluirse tal como se describe en la documentación . Hay un ejemplo para los casos en que desea usarlo como:
mvn dependency:copy
donde no se incluyen ningún objeto de artefacto pero no funciona.fuente
Esta publicación de blog muestra otro enfoque con la combinación de los complementos maven-jar y maven-assembly. Con la configuración de ensamblado xml de la publicación del blog, también se puede controlar si las dependencias se expandirán o solo se recopilarán en una carpeta y se hará referencia a ellas mediante una entrada de classpath en el manifiesto:
Y exactamente ese se describe aquí: https://caffebig.wordpress.com/2013/04/05/executable-jar-file-with-dependent-jars-using-maven/
fuente
fuente
Bien, entonces esta es mi solución. Sé que no está usando el archivo pom.xml. Pero tuve el problema de que mi programa se compilara y ejecutara en Netbeans pero fallaba cuando probé Java -jar MyJarFile.jar. Ahora, no entiendo completamente a Maven y creo que por eso estaba teniendo problemas para que Netbeans 8.0.2 incluyera mi archivo jar en una biblioteca para ponerlos en un archivo jar. Estaba pensando en cómo solía usar archivos jar sin Maven en Eclipse.
Es Maven que puede compilar todas las dependencias y complementos. No Netbeans. (Si puede obtener Netbeans y poder usar java .jar para hacer esto, dígame cómo (^. ^) V)
[Resuelto - para Linux] abriendo una terminal.
Entonces
próximo
próximo
Esto creará un archivo jar en el directorio de destino.
Ahora
(Es posible que tenga que ejecutar:
chmod +x MyJarFile-1.0-jar-with-dependencies.jar
)Y finalmente
Por favor mira
https://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException
Publicaré esta solución en un par de otras páginas con un problema similar. Espero poder salvar a alguien de una semana de frustración.
fuente