¿Cómo instruyo a Spring Boot Devtools a buscar las dependencias en un proyecto Maven?
Tengo un proyecto Maven de Spring Boot que crea un .war
gordo ejecutable. Puedo ejecutar este .war
utilizando java -jar
sin ningún problema ya que todas las dependencias se encuentran dentro del .war
gordo.
Sin embargo, no puedo ejecutar el proyecto con las Herramientas de Desarrollo de Spring Boot usando mvn spring-boot:run
, ya que no puede encontrar algunas dependencias en tiempo de ejecución y arroja excepciones no controladas.
Por ejemplo, tenemos una dependencia indirecta en jaxb-runtime-2.3.1.jar
, que a su vez tiene una dependencia en jaxb-api.2.3.1.jar
. Ambos .jars
están presentes en el .war
gordo, pero si ejecuto el proyecto con mvn spring-boot:run
, puede encontrar jaxb-runtime
correctamente pero no puede encontrar jaxb-api
con el mensaje:
java.nio.file.NoSuchFileException: ~/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar
Tenga en cuenta que jaxb-api-2.3.1.jar
está presente en la caché de Maven en:
~/.m2/repository/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar
Sin embargo, parece estar buscándolo en la misma ubicación que el padre jaxb-runtime-2.3.1.jar
, que se encuentra en:
~/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.1/
Hay una larga lista de excepciones similares que siguen este patrón. Es un proyecto bastante grande, pero aquí hay algunas de las versiones que estamos utilizando:
Spring Boot: 2.1.9.RELEASE
spring-boot-maven-plugin: 2.1.9.RELEASE
maven-compiler-plugin: 3.8.1
spring-boot-devtools: no especificado en el archivo pom
¿Por qué spring-boot:run
no encuentra las dependencias de la misma manera que la construcción de Maven? ¿Cómo puedo indicarle dónde encontrar estas dependencias?
davy.ai
El problema con
mvn spring-boot:run
que no puede encontrar dependencias que están presentes en el archivo.war
pero ubicadas en diferentes rutas a las esperadas se debe a los diferentes mecanismos de carga de clases utilizados por Maven y Spring Boot.Maven utiliza el repositorio local
.m2
para almacenar todas las dependencias y complementos descargados. Al construir el proyecto con Maven, todas las dependencias se resuelven desde el repositorio.m2
y se colocan en la ruta de acceso de compilación. El archivo.war
contiene todas las clases compiladas y recursos junto con sus dependencias en un solo paquete.Por otro lado, Spring Boot utiliza su propio mecanismo de carga de clases para resolver las dependencias en función de la configuración del proyecto. Al ejecutar el proyecto con
mvn spring-boot:run
, Spring Boot no utiliza el repositorio.m2
sino que busca dependencias en función de la configuración del proyecto.En este caso, dado que Spring Boot no puede ubicar la dependencia
jaxb-api
, es probable que la ubicación de la dependencia no esté configurada correctamente en el proyecto. Para indicar a Spring Boot dónde encontrar la dependencia, se puede configurar elspring-boot-maven-plugin
con las opcionesincludeSystemScope
eincludeScope
. Estas opciones se pueden utilizar para incluir dependencias del sistema y en tiempo de ejecución en el archivo.war
, lo que las hará disponibles para Spring Boot al ejecutar el proyecto conmvn spring-boot:run
.Aquí hay una configuración de ejemplo para el
spring-boot-maven-plugin
en el archivopom.xml
:Con esta configuración, el
spring-boot-maven-plugin
incluirá todas las dependencias del sistema y en tiempo de ejecución en el archivo.war
, lo que debería hacerlas disponibles para Spring Boot al ejecutar el proyecto conmvn spring-boot:run
.