Solución del conflicto del paquete jar en el proyecto Maven

Uno, error de conflicto del paquete jar en maven

Si se informan los siguientes errores durante la operación del proyecto MAVEN:

Causado por: java.lang.NoSuchMethodError
Causado por: java.lang.ClassNotFoundException

Ocho de nueve son causados ​​por conflictos en los paquetes jar de Maven.

Segundo, el principio del conflicto jar en maven

El paquete jar en maven tiene dependencias.
Suponga las siguientes dependencias:

A-> B-> C-> D1 (log 15.0): A contiene la dependencia de B, B contiene la dependencia de C y C contiene la dependencia de D1, suponiendo que D1 es un paquete jar de registro y la versión es 15.0
E-> F-> D2 (log 16.0): E contiene dependencia de F, F contiene dependencia de D2, suponiendo que D2 es el mismo paquete de registro jar, la versión es 16.0

Cuando se introducen dos dependencias A y E en el archivo pom.xml, de acuerdo con el principio de las dependencias de paso de Maven, se introducirán D1 y D2, y D1 y D2 son versiones diferentes de la misma dependencia D.
Cuando llamamos al método method1 () en D2, y D1 es la versión 15.0 (método1 puede ser el método agregado después de la actualización D), puede que no exista este método, de modo que cuando JVM carga la dependencia D1 en A, no se puede encontrar el método1 Método, informará el error NoSuchMethodError, esta vez hay un conflicto de paquete jar.
Nota:
Si se llama al método method2 (), tanto D1 como D2 contienen este método (y la versión actualizada D2 no cambia este método, por lo que incluso si D tiene varias versiones, no habrá conflictos de versiones).

Tres, resolución de conflictos de paquetes jar en maven

Comando de conflicto de paquete de análisis Mvn:

dependencia mvn: árbol

Cuando Maven analiza el archivo pom.xml, solo se mantendrá un paquete jar, entonces, ¿cómo resuelve el problema de los paquetes jar con múltiples versiones?

1. Estrategia de procesamiento predeterminada de Maven

  • El camino más corto primero

Cuando Maven se enfrenta a D1 y D2, seleccionará el paquete jar con la ruta más corta de forma predeterminada, a saber, D2. E-> F-> D2 es 1 más corto que A-> B-> C-> D1.

  • Declarar primero

Si la ruta es la misma, como: A-> B-> C1, E-> F-> C2, la longitud de las dos rutas dependientes es 2, luego elija declarar primero.

2. Eliminar dependencias: se utiliza para excluir un paquete jar dependiente

Use etiquetas en pom.xml para eliminar paquetes jar conflictivos

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        <version>1.4.4.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
            </exclusion>
    </exclusions>
</dependency>

3. Principio de bloqueo de versión: generalmente utilizado en el proyecto principal del proyecto heredado

Los proyectos normales son proyectos de varios módulos. Si el módulo A y el módulo B dependen de X como dependencia, entonces puede extraer X y establecer su número de versión al mismo tiempo, de modo que cuando X depende de la actualización, no necesita separar el módulo A y el módulo B. Depende de X para actualizar, para evitar demasiados lugares (moduleC, moduleD ...) olvide actualizar y causar conflictos de paquetes jar al hacer referencia a dependencias X, que también es un método común en el desarrollo real del proyecto.

Primero defina un pom.xml padre, coloque la dependencia pública en el pom.xml para declarar:

<properties>
    <spring.version>spring4.2.4</spring.version>
<properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.versio}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

De esta manera, por ejemplo, cuando el módulo A y el módulo B se refieren al paquete jar Spring-beans, pueden usar directamente las dependencias públicas definidas en el pom.xml padre: el
módulo A usa el paquete jar spring-bean en su pom.xml (no es necesario definir la versión):

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
    </dependency>
</dependencies>
Publicado 9 artículos originales · elogiado 0 · visitas 62

Supongo que te gusta

Origin blog.csdn.net/yangbllove/article/details/105569492
Recomendado
Clasificación