2012-06-15 8 views
11

Tengo 2 proyectos usando Maven. El primero es una biblioteca que contiene clases y métodos de utilidad. El segundo proyecto es una aplicación real que tiene la biblioteca como una dependencia. Mi biblioteca utiliza internamente una biblioteca de terceros.Limitando una dependencia transitiva al alcance del tiempo de ejecución en Maven

Así que estas son las dependencias:

  • Mi biblioteca: depende de la biblioteca de terceros
  • Mi aplicación: depende de mi biblioteca

Sin embargo, yo no quiero que el las clases de biblioteca de terceros estarán disponibles en compilando el tiempo en mi aplicación. Esto se debe a que la aplicación es compatible con un equipo grande y quiero evitar que las personas accidentalmente utilicen métodos de la biblioteca de terceros en la aplicación dado que algunos nombres de clase y algunos nombres de método son similares entre los dos. Por supuesto, la biblioteca del tercer par deberá estar disponible en mi aplicación al runtime.

Si el alcance para todas mis dependencias fuera compilar, no alcanzaría mi objetivo. ¿Hay alguna manera de lograr esto en Maven 3?

Respuesta

16

Muy buena pregunta y desafortunadamente no puedes hacer esto usando Maven 3, o 2, o cualquier otra versión, debido a su diseño fundamental. Lo que estás preguntando es en realidad un comportamiento deseado e ideal, ya que de hecho las dependencias compile de cualquier artefacto deberían ser transitivas con el alcance runtime. Sin embargo, un diseño como este genera algunos problemas. Como se puede leer en Maven's Introduction to the Dependency Mechanism sobre compile alcance:

Se pretende que esto debe haber un margen de tiempo de ejecución en su lugar, de modo que todos dependencias de compilación deben aparecer de forma explícita - sin embargo, no es el caso en la biblioteca que depende on extiende una clase desde otra biblioteca , lo que le obliga a tener disponible en tiempo de compilación. Por este motivo , las dependencias de tiempo de compilación permanecen como ámbito de compilación incluso cuando son transitivas.

Así que, como ve, lo que necesita es en realidad el diseño adecuado de este comportamiento que lamentablemente es imposible de implementar.

+1

Tenía la esperanza de que hubiera una manera de hacerlo . Gracias por tu respuesta, Michal. – Juanal

+0

Esto fue respondido hace años. ¿Hay alguna manera de hacer esto ahora? Me pregunto si de alguna manera podrías usar un alcance de 'import' para hackear una solución aquí. –

+1

No creo que haya cambiado nada aquí. Como dije en 2012, es un diseño Maven muy fundamental. Creo que no hay forma ahora de cambiar esto ya que es solo cómo Maven hace las cosas desde el principio. –

4

Nada ha cambiado durante los últimos tres años, por lo que la respuesta de Michal sigue siendo correcta: no hay forma de limitar la visibilidad transitiva en Maven.

Sin embargo, debe considerar rediseñar su biblioteca para dividirla en un api-artefacto que es necesario como dependencia de tiempo de compilación y que no depende de la biblioteca de terceros y un artefacto de implementación que solo es necesario como dependencia del tiempo de ejecución y que depende de la biblioteca de terceros.

2

En su aplicación, puede declarar una dependencia explícita en la biblioteca de terceros utilizando el ámbito "runtime".

Esto evita que se vea la biblioteca de terceros en tiempo de compilación y, por lo tanto, no se pueden introducir usos directos. Sin embargo, seguirá presente en tiempo de ejecución (ya que su biblioteca lo necesita).

Esto funciona, pero es incómodo y merece un comentario XML explicativo en el pom.

0

Las demás respuestas son correctas. Además de trabajar en torno en torno a una característica crucial faltante en experta dividiendo a cabo un módulo API de sólo artificial, también tiene estas alternativas:

  • excluyen las dependencias transitivas, entonces dependerá directamente (usted tiene que manejar los números de versión usted mismo)
  • Utilice el control de importación checkstyle y CI. De esa forma los miembros del equipo pueden usar los elementos transitorios, pero luego la verificación maven fallará
  • Use gradle. Esta es una solución a muchas limitaciones de Maven
Cuestiones relacionadas