Los artefactos de las dependencias se pueden excluir declarando un <exclusions>elemento dentro de un <dependency>Pero en este caso es necesario excluir un artefacto heredado de un proyecto principal. A continuación, se muestra un extracto del POM en discusión:
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>jruby</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <artifactId>base</artifactId>
        <groupId>es.uniovi.innova</groupId>
        <version>1.0.0</version>
    </parent>
    <dependencies>      
        <dependency>
            <groupId>com.liferay.portal</groupId>
            <artifactId>ALL-DEPS</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</project>
baseartefacto, depende   javax.mail:mail-1.4.jary ALL-DEPSdepende de otra versión de la misma biblioteca. Debido al hecho de que mail.jardesde ALL-DEPSexiste en el entorno de ejecución, aunque no se exporta, choca con el mail.jarque existe en el padre, que tiene el alcance compile.
Una solución podría ser eliminar mail.jar del POM principal, pero la mayoría de los proyectos que heredan la base la necesitan (como es una dependencia transtiva para log4j). Entonces, lo que me gustaría hacer es simplemente excluir la biblioteca principal del proyecto secundario , ya que se podría hacer si basefuera una dependencia y no el pom principal:
...
    <dependency>
        <artifactId>base</artifactId>
        <groupId>es.uniovi.innova</groupId>
        <version>1.0.0</version>
        <type>pom<type>
        <exclusions>
          <exclusion>
             <groupId>javax.mail</groupId>
             <artifactId>mail</artifactId>
          </exclusion>
        </exclusions>
    </dependency>
...

Puede agrupar sus dependencias dentro de un proyecto diferente con un paquete
pomcomo se describe en las Mejores prácticas de Sonatypes :y haga referencia a ellos desde su parent-pom (observe la dependencia
<type>pom</type>):Su proyecto hijo hereda este pom principal como antes. Pero ahora, la dependencia de correo se puede excluir en el proyecto hijo dentro del
dependencyManagementbloque:fuente
No uses un pom principal
Esto puede sonar extremo, pero de la misma manera que el "infierno de la herencia" es una razón por la que algunas personas dan la espalda a la Programación Orientada a Objetos (o prefieren la composición a la herencia ), eliminan el
<parent>bloque problemático y copian y pegan lo<dependencies>que necesiten (si su equipo le da esta libertad).Se debe ignorar la suposición de que la división de poms en padres e hijos para "reutilizarlos" y "evitar la redundancia" debe ser ignorada y usted debe atender sus necesidades inmediatas primero (la cura es peor que la enfermedad). Además, la redundancia tiene sus ventajas, a saber, la independencia de los cambios externos (es decir, la estabilidad).
Esto es más fácil de lo que parece si genera el pom efectivo (eclipse lo proporciona pero puede generarlo desde la línea de comandos con
mvn help:effective).Ejemplo
Quiero usarlo
logbackcomo mi enlace slf4j, pero mi pom principal incluye lalog4jdependencia. No quiero ir y tener que empujar la dependencia de los otros niños a log4j en sus propiospom.xmlarchivos para que el mío no esté obstruido.fuente
Redefina la dependencia (en el pom hijo) con el
scopesistema apuntando a un frasco vacío:El frasco puede contener solo un archivo vacío:
fuente
notepad empty.classa continuación,jar cvf empty.jar empty.classpara generar un frasco vacío.¿Ha intentado declarar explícitamente la versión de mail.jar que desea? La resolución de dependencia de Maven debería usar esto para la resolución de dependencia sobre todas las demás versiones.
fuente
La mejor opción es hacer que las dependencias que no siempre desea heredar sean intransitivas.
Puede hacer esto marcándolos en el pom principal con el alcance proporcionado.
Si aún desea que el padre administre las versiones de estos departamentos, puede usar la
<dependencyManagement>etiqueta para configurar las versiones que desee sin heredarlas explícitamente o pasar esa herencia a los hijos.fuente
Cuando llama a un paquete pero no desea algunas de sus dependencias, puede hacer algo como esto (en este caso, no quería que se agregara el antiguo log4j porque necesitaba usar el más nuevo):
Esto funciona para mí ... pero soy bastante nuevo en java / maven, por lo que tal vez no sea óptimo.
fuente
Realmente necesitaba hacer esta cosa sucia ... Así es como
Redefiní esas dependencias con alcance
test. Scopeprovidedno funcionó para mí.Usamos el complemento Spring Boot para construir fat jar. Tenemos un módulo común que define bibliotecas comunes, por ejemplo Springfox swagger-2. Mi superservicio debe tener un padre en común (no quiere hacerlo, ¡pero las reglas de la compañía obligan!)
Entonces mi padre o los comunes tienen pom.
Y mi pom de súper servicio .
Este es el tamaño del artefacto de grasa final.
También vale la pena mencionar esta respuesta: quería hacerlo, pero soy vago ... https://stackoverflow.com/a/48103554/4587961
fuente
Podemos agregar el pom principal como una dependencia con el tipo pom y excluirlo. Porque de todos modos se descarga parent pom. Esto funcionó para mi
fuente