tutorial starter proyectos example español application maven spring-boot jar spring-boot-maven-plugin

maven - starter - ¿Cómo agregar una dependencia a un Spring Boot Jar en otro proyecto?



spring boot web application example (3)

Tengo una aplicación Spring Boot y he creado un Jar de eso. Lo siguiente es mi pom.xml :

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-java8time</artifactId> <version>2.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- WebJars --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.6.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>

Quiero utilizar este Jar en mi otra aplicación, así que agregué este jar a mi aplicación. Pero cuando estoy llamando a un método en ese Jar, está lanzando una ClassNotFoundException .

¿Cómo puedo solucionar este problema? ¿Cómo puedo agregar una dependencia a Spring Boot JAR?


Lo que @Tunaki afirmó fue en su mayoría correcto, pero la única parte faltante basada en su pregunta original fue:

Esto arrojando ClassNotFoundException. El contenedor externo utilizado en la aplicación de arranque de primavera no se encuentra.

Esto se debe al hecho de que el FatJAR creado a partir del paquete maven tiene las bibliotecas dependientes especificadas en una ubicación específica que funciona según cómo Spring Boot ejecuta la aplicación. Si solo está agregando el JAR al classpath de otra aplicación, entonces debe hacer lo que dijo @Tunaki y también incluir los archivos JAR dependientes en el classpath. La mejor manera de trabajar con esto es usar el Complemento de dependencia de Maven específicamente dirigido a la dependency:copy-dependencies mojo de dependency:copy-dependencies para descargar todas las dependencias en una carpeta que luego puede especificar como una ruta de biblioteca al compilar la otra aplicación.


Por defecto, Spring Boot vuelve a empaquetar su JAR en un JAR ejecutable, y lo hace colocando todas sus clases dentro de BOOT-INF/classes , y todas las bibliotecas dependientes dentro de BOOT-INF/lib . La consecuencia de crear este JAR gordo es que ya no puede usarlo como una dependencia para otros proyectos.

Del clasificador de reempaquetado personalizado :

De forma predeterminada, el objetivo de repackage reemplazará el artefacto original con el empaquetado de nuevo. Ese es un comportamiento sensato para los módulos que representan una aplicación, pero si su módulo se utiliza como una dependencia de otro módulo, debe proporcionar un clasificador para el empaquetado de nuevo.

El motivo es que las clases de aplicación están empaquetadas en BOOT-INF/classes para que el módulo dependiente no pueda cargar las clases de un paquete reenvasado.

Si desea conservar el artefacto principal original para utilizarlo como dependencia, puede agregar un classifier en la configuración del objetivo de repackage :

<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.4.1.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>exec</classifier> </configuration> </execution> </executions> </plugin>

Con esta configuración, Spring Boot Maven Plugin creará 2 JARs: el principal será el mismo que el proyecto Maven habitual, mientras que el segundo tendrá el clasificador adjunto y será el JAR ejecutable.


Puede configurar sus proyectos para que el iniciador de lotes dependa de un jar, que se compartiría con su otra aplicación.

Dicho de manera diferente, según su solicitud inicial:

Quiero utilizar este Jar en mi otra aplicación, así que agregué este jar a mi aplicación.

Digamos que su jar es su proyecto A, y su aplicación es su proyecto B.

Ahora, lo que sugiero, es que elimines la parte de lanzamiento de A; luego lo pones en un nuevo proyecto C, que incorporaría Spring Boot, y eso dependería casi totalmente de A.

Entonces, como A es ahora un simple jar, B puede usarlo como una dependencia.