¿Cómo coloco todos los archivos JAR requeridos en una carpeta de biblioteca dentro del archivo JAR final con Maven?

Estoy usando Maven en mi aplicación independiente, y quiero empaquetar todas las dependencias en mi archivo JAR dentro de una carpeta de biblioteca, como se menciona en una de las respuestas aquí:

¿Cómo puedo crear un JAR ejecutable con dependencias usando Maven?

Quiero que mi archivo JAR final tenga una carpeta de biblioteca que contenga las dependencias como archivos JAR, no como el maven-shade-plugin que pone las dependencias en forma de carpetas como la jerarquía Maven en la carpeta .m2.

Bueno, en realidad la configuración actual hace lo que quiero, pero tengo un problema con la carga de los archivos JAR cuando se ejecuta la aplicación. No puedo cargar las clases.

Aquí está mi configuración:

   org.apache.maven.plugins maven-dependency-plugin   copy-dependencies prepare-package  copy-dependencies   ${project.build.directory}/classes/lib false false true      org.apache.maven.plugins maven-jar-plugin    true lib/ com.myapp.MainClass      org.apache.maven.plugins maven-compiler-plugin  1.6 1.6    org.apache.maven.plugins maven-dependency-plugin   install install  sources      org.apache.maven.plugins maven-resources-plugin 2.5  UTF-8    

El proyecto funciona bien desde Eclipse, y los archivos JAR se colocan en la carpeta de la biblioteca dentro de mi archivo JAR final como yo quiera, pero cuando ejecuto el archivo JAR final desde la carpeta de destino siempre obtengo ClassNotFoundException :

 Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: com.myapp.MainClass. Program will exit. 

¿Cómo puedo solucionar esta excepción?

La siguiente es mi solución. Pruébalo si funciona para ti:

  org.apache.maven.plugins maven-dependency-plugin   copy-dependencies prepare-package  copy-dependencies   ${project.build.directory}/classes/lib false false true      org.apache.maven.plugins maven-jar-plugin    true     lib/     

El primer complemento coloca todas las dependencias en la carpeta target / classes / lib, y el segundo incluye la carpeta de la biblioteca en el archivo JAR final y configura el archivo Manifest.mf .

Pero luego deberá agregar un código personalizado de carga de clases para cargar los archivos JAR.

O bien, para evitar la carga de clases personalizada, puede usar “$ {project.build.directory} / lib, pero en este caso, no tiene dependencias dentro del archivo JAR final, lo cual infringe el propósito.

Han pasado dos años desde que se hizo la pregunta. El problema de los archivos JAR nesteds persiste sin embargo. Espero que ayude a alguien.

Actualizado:

    maven-dependency-plugin   install  copy-dependencies   ${project.build.directory}/lib       

La forma más simple y más eficiente es usar un plugin de uber como este:

   org.apache.maven.plugins maven-shade-plugin   package  shade     uber-${artifactId}-${version}   

Habrá desnormalizado todo en un archivo JAR.

El complemento Maven del empaquetador ejecutable se puede usar exactamente para ese propósito: crear aplicaciones java independientes que contengan todas las dependencias como archivos JAR en una carpeta específica.

Simplemente agregue lo siguiente a su pom.xml dentro de la sección (asegúrese de reemplazar el valor de mainClass consecuencia):

  de.ntcomputer executable-packer-maven-plugin 1.0.1  com.example.MyMainClass     pack-executable-jar     

El archivo JAR target/-pkg.jar se encuentra en target/-pkg.jar después de ejecutar el mvn package . Todas sus dependencias en tiempo de comstackción y en tiempo de ejecución se incluirán en la carpeta lib/ dentro del archivo JAR.

Descargo de responsabilidad: soy el autor del complemento.

siguiendo este enlace:

Cómo: Eclipse Maven instala el jar de construcción con dependencias

descubrí que esta solución no es viable porque el cargador de clases no carga los flasks desde dentro de los flasks, por lo que creo que desempaquetaré las dependencias dentro del flask.

Así es como lo hago:

   maven-assembly-plugin 2.2  false  jar-with-dependencies    com.project.MainClass     

Y luego solo corro:

 mvn assembly:assembly 

Encontré esta respuesta a la pregunta:

http://padcom13.blogspot.co.uk/2011/10/creating-standalone-applications-with.html

No solo obtiene los archivos lib dependientes en una carpeta lib, sino que también obtiene un director de bin con un ejecutable tanto de UNIX como de DOS.

El ejecutable finalmente llama a Java con un argumento -cp que también enumera todas sus bibliotecas dependientes.

Todo el lote se encuentra en una carpeta de instalación dentro de la carpeta de destino. Épico.

========================================================================================================================================================================================

Este es claramente un problema de classpath. Tenga en cuenta que classpath debe cambiar un poco cuando ejecuta su progtwig fuera del IDE. Esto se debe a que el IDE carga los otros JAR relativos a la carpeta raíz de su proyecto, mientras que en el caso del JAR final esto generalmente no es cierto.

Lo que me gusta hacer en estas situaciones es construir el JAR manualmente. Me lleva como máximo 5 minutos y siempre resuelve el problema. No sugiero que hagas esto. Encuentra una manera de usar Maven, ese es su propósito.