2012-09-27 12 views
15

En mi proyecto hay una clase que implementa una interfaz. La interfaz proviene de una dependencia. Tengo otra dependencia que también tiene una dependencia en un jar que también contiene la misma interfaz, excepto una versión con más métodos; las dos jarras que contienen la misma interfaz de paquete NO tienen el mismo ID de grupo o artefacto.
La compilación está fallando porque el compilador se queja de que la clase en mi proyecto no está implementando todos los métodos. Me di cuenta de que es porque el compilador toma la referencia de la interfaz del contenedor equivocado. Mi pregunta es, , ¿por qué maven usa la interfaz de la dependencia transitiva en lugar de la del jar que menciono explícitamente en el POM del proyecto? Veo que el jar que se usa aparece antes en la definición (así que me lo imagino en el classpath también), pero pensé que en estos casos maven lo resolvió usando la clase/interfaz colisionando de la dependencia con el , el camino más cortoOrden de dependencia de Maven

Aquí está la parte del árbol de dependencias. Tenga en cuenta que esto se grepped pero todavía puede verse que javax.servlet:servlet-api (la que realmente se) es más profunda en el árbol en comparación con tomcat:servlet (la que debe ser usado)

[[email protected] proj]$ mvn dependency:tree | grep servlet 
[INFO] | +- javax.servlet:servlet-api:jar:2.4:compile 
[INFO] +- tomcat:servlet:jar:4.0.6:compile 

estoy usando Maven 3.0 0.4

+0

tomcat: servlet: jar debe proporcionarse, no compilar. Debería compilar contra javax.servlet: servlet-api y agregar una dependencia en la versión adecuada. – OrangeDog

Respuesta

14

¿por qué maven usa la interfaz de la dependencia transitiva en lugar de la del jar que menciono explícitamente en el proyecto POM de ?

Porque, para Maven, las dos no tienen nada que ver entre sí. Maven no sabe acerca de los nombres de clase o paquete, Maven solo sabe sobre groupId y artifactId. Como esos no son lo mismo, maven no tiene ninguna razón para omitir la dependencia transitiva.

Y si estoy en lo correcto, Maven coloca las dependencias en el classpath en el orden en que se definen, es decir, las dependencias transitivas de la dependencia a aparecen antes de la dependencia b.

5

Cuando se declara su dependencia de otro archivo jar se puede decir que para excluir la dependencia transitiva en el archivo jar en conflicto:

<dependency> 
     <groupId>group</groupId> 
     <artifactId>artifact</artifactId> 
     <version>1.0.0</version> 
     <exclusions> 
      <exclusion> 
       <groupId>othergroup</groupId> 
       <artifactId>ArtifactToExclude</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
+0

Sí, pensé en hacer eso. Pero mi pregunta, más que cómo solucionarlo, es ¿por qué maven toma la interfaz del contenedor equivocado? Quiero entender la lógica – Hilikus

+3

En cuyo caso, creo que Sean Patrick Floyd está en lo correcto, aparecerán en el classpath en el orden en que están declarados en su archivo pom. –

Cuestiones relacionadas