Incluyendo dependencias en un contenedor con Maven

¿Hay alguna manera de forzar a maven (2.0.9) a incluir todas las dependencias en un solo archivo jar?

Tengo un proyecto de las comstackciones en un solo archivo jar. También quiero que las clases de las dependencias se copien en el contenedor.

Actualización: sé que no puedo incluir un archivo jar en un archivo jar. Estoy buscando una manera de descomprimir los archivos jar que se especifican como dependencias, y empacar los archivos de clase en mi jar.

Puede hacerlo utilizando el complemento maven-assembly con el descriptor “jar-with-dependence”. Aquí está el fragmento relevante de uno de nuestros pom.xml que hace esto:

    maven-assembly-plugin   package  single      jar-with-dependencies      

Con Maven 2, la forma correcta de hacerlo es usar el Complemento de ensamblaje de Maven2, que tiene un archivo de descriptor predefinido para este fin y que puede usar en la línea de comando:

 mvn assembly:assembly -DdescriptorId=jar-with-dependencies 

Si desea que este archivo jar sea ejecutable, solo agregue la clase principal que se ejecutará en la configuración del complemento:

  org.apache.maven.plugins maven-assembly-plugin    my.package.to.my.MainClass     

Si desea crear ese ensamblaje como parte del proceso de comstackción normal, debe vincular el objective único o de directorio único (el objective de assembly SÓLO debe ejecutarse desde la línea de comando) a una fase de ciclo de vida (el package tiene sentido), algo así como esta:

  org.apache.maven.plugins maven-assembly-plugin   create-my-bundle package  single    jar-with-dependencies  ...     

Adapte el elemento de configuration para satisfacer sus necesidades (por ejemplo, con las cosas manifiestas tal como se dicen).

Si desea hacer un archivo jar ejecutable, también debe configurar la clase principal. Entonces la configuración completa debería ser.

    maven-assembly-plugin   package  single        fully.qualified.MainClass    jar-with-dependencies     

Existe el plugin maven plugin . Se puede usar para empaquetar y cambiar el nombre de las dependencias (para omitir los problemas de dependencia en la ruta de clases).

Si a ti (como yo) no le gusta particularmente el enfoque jar-with-dependence descrito anteriormente, la solución maven que prefiero es simplemente construir un proyecto WAR, incluso si solo se trata de una aplicación java autónoma que estás construyendo:

  1. Haga un proyecto de jar maven normal, que construirá su archivo jar (sin las dependencias).

  2. Además, configure un maven war-project (con solo un archivo src / main / webapp / WEB-INF / web.xml vacío, que evitará una advertencia / error en maven-build), que solo tiene su proyecto jar como una dependencia, y haga de su proyecto jar un en su war-project. (Este proyecto de guerra es solo un truco simple para envolver todas sus dependencias de archivos jar en un archivo comprimido).

  3. Construye el proyecto de guerra para producir el archivo de guerra.

  4. En el paso de implementación, simplemente cambie el nombre de su archivo .war a * .zip y descomprímalo.

Ahora debería tener un directorio lib (que puede mover donde lo desee) con su jar y todas las dependencias que necesita para ejecutar su aplicación:

 java -cp 'path/lib/*' MainClass 

(El comodín en classpath funciona en Java-6 o superior)

Creo que esto es más fácil de configurar en Maven (no es necesario perder el plugin de ensamblaje) y también te da una visión más clara de la estructura de la aplicación (verás los números de versión de todos los flasks a la vista, y evite atascar todo en un solo archivo jar).

Puede usar el jar creado recientemente usando una etiqueta .

   your.group.id your.artifact.id 1.0 jar jar-with-dependencies   

http://fiji.sc/Uber-JAR proporciona una excelente explicación de las alternativas:

Hay tres métodos comunes para construir un uber-JAR:

  1. Sin sombrear Desempaquete todos los archivos JAR, luego vuelva a empaquetarlos en un solo JAR.
    • Pro: funciona con el cargador de clases predeterminado de Java.
    • Con: los archivos presentes en varios archivos JAR con la misma ruta (por ejemplo, META-INF / services / javax.script.ScriptEngineFactory) se sobreescribirán entre sí, lo que dará como resultado un comportamiento defectuoso.
    • Herramientas: Maven Assembly Plugin, Classworlds Uberjar
  2. Sombreado Igual que sin sombrear, pero cambie el nombre (es decir, “sombrear”) todos los paquetes de todas las dependencias.
    • Pro: funciona con el cargador de clases predeterminado de Java. Evita algunos (no todos) los conflictos de versiones de dependencias.
    • Con: los archivos presentes en varios archivos JAR con la misma ruta (por ejemplo, META-INF / services / javax.script.ScriptEngineFactory) se sobreescribirán entre sí, lo que dará como resultado un comportamiento defectuoso.
    • Herramientas: Maven Shade Plugin
  3. JAR de JARs. El archivo JAR final contiene los otros archivos JAR incrustados dentro.
    • Pro: evita conflictos de versiones de dependencia. Todos los archivos de recursos se conservan.
    • Con: Necesita agrupar un cargador de clases especial “bootstrap” para permitir que Java cargue clases desde los archivos JAR empaquetados. La depuración de los problemas del cargador de clases se vuelve más compleja.
    • Herramientas: Eclipse JAR File Exporter, One-JAR.

Mi solución definitiva en Eclipse Luna y m2eclipse: Custom Classloader (descarga y agrega a tu proyecto, 5 clases solamente): http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/plain/org. eclipse.jdt.ui / jar% 20in% 20jar% 20loader / org / eclipse / jdt / internal / jarinjarloader / ; este cargador de clases es lo mejor de un cargador de clases de un tarro y muy rápido;

org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader my.Class

Edite en JIJConstants “Rsrc-Class-Path” en “Class-Path”
mvn clean dependency: paquete copy-dependencies
se crea un contenedor con dependencias en la carpeta lib con un cargador de clases delgado

    src/main/java  **/*.java **/*.properties    src/main/resources true  **/*  META-INF/   ${project.build.directory}/dependency/  *.jar  lib/      org.apache.maven.plugins maven-jar-plugin    true ${project.mainClass} lib/   ${project.realMainClass}  ./      org.apache.maven.plugins maven-dependency-plugin   copy-dependencies package  copy-dependencies        
     org.apache.maven.plugins maven-dependency-plugin  ${project.build.directory}/lib false false    copy-dependencies package  copy-dependencies       org.apache.maven.plugins maven-jar-plugin 2.4    true lib/        maven-assembly-plugin   package  single      jar-with-dependencies    

Dejando a un lado a Maven, puedes poner las librerías JAR dentro de la jarra principal, pero necesitarás usar tu propio cargador de clases.

Verifique este proyecto: texto de enlace One-JAR

Esta publicación puede ser un poco antigua, pero también tuve el mismo problema recientemente. La primera solución propuesta por John Stauffer es buena, pero tuve algunos problemas ya que estoy trabajando esta spring. Los archivos jar de dependencia de la spring que uso tienen algunos archivos de propiedades y una statement xml-schemas que comparten los mismos caminos y nombres. Aunque estos archivos provienen de las mismas versiones, el maven-goal jar-with-dependence sobrescribió el archivo tess con el último archivo encontrado.

Al final, la aplicación no pudo comenzar ya que los contenedores de resorte no pudieron encontrar los archivos de propiedades correctos. En este caso, la solución propuesta por Rop ha resuelto mi problema.

También desde entonces, el proyecto de arranque de spring ahora existe. Tiene una forma genial de gestionar este problema al proporcionar un objective maven que sobrecarga el objective del paquete y proporciona su propio cargador de clases. Vea las botas de spring Guía de referencia

Eche un vistazo a esta respuesta:

Estoy creando un instalador que se ejecuta como un archivo Java JAR y necesita descomprimir los archivos WAR y JAR en lugares apropiados en el directorio de instalación. El complemento de dependencia se puede utilizar en la fase del paquete con el objective de copia y descargará cualquier archivo en el repository Maven (incluidos los archivos WAR) y los escribirá donde los necesite. Cambié el directorio de salida a $ {project.build.directory} / classes y luego el resultado final es que la tarea normal de JAR incluye mis archivos muy bien. Entonces puedo extraerlos y escribirlos en el directorio de instalación.

  org.apache.maven.plugins maven-dependency-plugin   getWar package  copy     the.group.I.use MyServerServer ${env.JAVA_SERVER_REL_VER} war myWar.war   ${project.build.directory}/classes    

Gracias He agregado el siguiente fragmento en el archivo POM.xml y el problema de Mp resuelto y creo un archivo jar gordo que incluye todos los archivos jar dependientes.

  maven-assembly-plugin   package  single      dependencies     
Intereting Posts