es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , , ,

Answer

  1. Avatar for 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 el spring-boot-maven-plugin con las opciones includeSystemScope e includeScope. 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 con mvn spring-boot:run.

    Aquí hay una configuración de ejemplo para el spring-boot-maven-plugin en el archivo pom.xml:

    <build>
      <plugins>
        <plugin>
          <groupid>org.springframework.boot</groupid>
          <artifactid>spring-boot-maven-plugin</artifactid>
          <version>${spring-boot.version}</version>
          <configuration>
            <includesystemscope>true</includesystemscope>
            <includescope>runtime</includescope>
          </configuration>
          <executions>
            <execution>
              <goals>
                <goal>repackage</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
    

    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 con mvn spring-boot:run.

Comments are closed.