2010-09-30 21 views
7

Por ejemplo, si hay dependencias:Maven: ¿Cómo eliminar las dependencias si ya son transitivas?

a -> b 
a -> c 
b -> c 

que quieren eliminar la dependencia a -> c, porque hay a -> b -> c.

Sé que puede haber algunas dependencias fuertes que no deberían reducirse, pero no es relevante para esta pregunta.

Ejemplo:

In a.pom: 
<dependencies> 
    <dependency>b</dependency> 
    <dependency>c</dependency> 
</dependencies> 

In b.pom: 
<dependencies> 
    <dependency>c</dependency> 
</dependencies> 

Resultado esperado:

In a.pom: 
<dependencies> 
    <dependency>b</dependency> 
</dependencies> 
+4

Y lo que es * * la pregunta? –

+2

Y luego su compilación se rompe si b cambia y ya no depende de c. ¿Por qué quieres ocultar esa dependencia, si está realmente allí? –

+0

@Thomas no es relevante para esta pregunta. –

Respuesta

12

Supongo que quiere encontrar las dependencias falsas/innecesarias que ya se han cumplido porque las obtiene de forma gratuita de otra dependencia.

Me imagino que podría querer hacer eso para limpiar sus poms.

Sin embargo, normalmente no es algo que le gustaría hacer, ya que es una buena práctica indicar explícitamente cuáles son sus dependencias.

nunca se sabe si en el futuro módulo de b elimina c como la dependencia y por lo tanto se rompe a

+0

Tiene razón. Tengo que limpiar los poms, las dependencias no están tan bien declaradas porque los programadores no están muy familiarizados con las herramientas Maven y la ingeniería de software. Las dependencias son en su mayoría administradas por IDEs. También es valioso generar un gráfico de dependencia minimizado con fines ilustrativos. –

2

Como los otros, no estoy seguro de lo que quiere lograr. ¿Pueden ser exclusiones lo que necesita? Puede usar exclusiones para eliminar dependencias de sus dependencias, si no son deseadas por alguna razón.

 <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>1.1.1</version> 
      <exclusions> 
       <exclusion> 
        <groupId>log4j</groupId> 
        <artifactId>log4j</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>logkit</groupId> 
        <artifactId>logkit</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>avalon-framework</groupId> 
        <artifactId>avalon-framework</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>javax.servlet</groupId> 
        <artifactId>servlet-api</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
14

Uso mvn dependency:analyze que le muestre si hay dependencias en su pom que no necesitas (que también puede identificar algunos que no se ha contestado, añadir -DoutputXML=true para mostrar las entradas que faltan).

Use mvn dependency:tree para mostrarle las dependencias actualmente en uso por su proyecto y dónde las encuentra Maven. Agregue -Dverbose=true para mostrar todos los duplicados y conflictos.

Si adirectamente depende de c (es decir, si el código en a menciona clases en c), entonces el pom debe reflejarlo. Si a solo depende directamente de b, puede eliminar de forma segura la dependencia c del archivo pom.xml de a. Los comandos anteriores deberían permitirle determinar cuál es la próxima acción apropiada.

Editar: Bien, ha actualizado su pregunta. Aquí es cómo se hace:

  1. en el proyecto a, ejecute mvn dependency:tree -Dverbose=true. Esto le mostrará un árbol completo de todas las dependencias consideradas por Maven para su proyecto.
  2. Mire la salida del paso 1 y haga una lista de todas las dependencias que se muestran en más de un nivel de profundidad (algunas de ellas probablemente serán duplicadas).
  3. editar el archivo pom.xml en el editor que gusta y eliminar cualquier dependencia que coinciden con la lista que ha creado en el paso 2.

O usted está buscando una manera de hacerlo de forma automática? No creo que haya una forma automática a menos que usted escriba uno usted mismo, porque lo que está tratando de hacer es BAD IDEA. Le está diciendo a la gente que sus objeciones son "irrelevantes" para su pregunta, pero el hecho es que su pregunta es como preguntar "¿Cómo puedo usar Maven para que sea más difícil usar Maven?"

No hay una buena razón por la que desee hacer esto. Si cree que hay una buena razón, entonces debe intentar hacerlo para producir algún resultado.Debería pedir ayuda con el resultado deseado, porque su plan es malo.

+0

tenga en cuenta que debe ejecutar 'mvn install' antes' dependency: analyze' porque el análisis se realiza en el artefacto compilado –

Cuestiones relacionadas