2010-05-26 20 views
29

Mi proyecto P depende de la dependencia A que depende de la dependencia B. El archivo pom.xml de mi proyecto incluye A como una dependencia, y su jar se incluye en el classpath de P. Sin embargo, hay un NoClassDefFoundError lanzado en el tiempo de ejecución de P, que proviene de frascos B faltantes.Maven. Dependencias transitivas

¿No debería Maven haber descargado estas dependencias automáticamente?

Respuesta

20

Mi proyecto P depende de la dependencia A [con un ámbito de compilación] que depende de la dependencia B [con un alcance de compilación].

A menos que B es un optional dependency de A, B debería ser una dependencia de P con un alcance "compilar (*)" (ver la tabla de Dependency Scope y leer la nota) y por lo tanto debe estar disponible en tiempo de ejecución.

Sin embargo, hay un NoClassDefFoundError lanzado en el tiempo de ejecución de P, que se debe a que faltan B jarras.

Dado que está ejecutando el proyecto en Eclipse, la ruta de clase está configurada para usted, por lo que excluiré un error en este nivel. Esto nos deja con el caso de la dependencia opcional.

PD: Una herramienta muy útil para investigar este tipo de problema es dependency:tree.

+1

re la última oración: La vista de jerarquía de dependencia en m2eclipse es mucho más fácil de usar que la dependencia: tree, incluso le da un asistente de 'exclusión' –

+0

@seanizer: True (suponiendo que OP está utilizando m2eclipse). Tenga en cuenta que ['dependency: tree'] (http://maven.apache.org/plugins/maven-dependency-plugin) también admite [filtering] (http://maven.apache.org/plugins/maven-dependency- plugin/examples/filtering-the-dependency-tree.html). –

+0

Supongo que cualquiera que use maven y eclipse juntos también usa m2eclipse, ya que es mucho más potente y cómodo que el complemento maven-eclipse (editor de pom, índice de repositorio, cambios automáticos de configuración cuando se editó pom, etc.). y por supuesto también incluye filtrado: haga clic en cualquier artefacto en la jerarquía y solo se muestra la jerarquía de este artefacto ... –

2

Si esta dependencia A tiene un alcance compilar, claro, debería haberse descargado y estar más disponible en exceso en el classpath del proyecto. Pero si tuviera se proporcionaba el alcance que sería el caso, ya que los deps proporcionados no se incluirían con la aplicación de Maven.

Por cierto, ¿cómo está ejecutando este proyecto? No ejecutar de la manera adecuada también podría causar tales problemas y esta es una muy buena suposición. Por ejemplo, si está utilizando maven exec plugin, maven configurará correctamente el classpath por usted, pero de lo contrario, debe configurarlo usted mismo (o compilar un jar con dependencias con el assembly plugin).

+0

A enumera B como una dependencia con "compilar" ámbito de aplicación; P lista a A como una dependencia con el alcance "compilar". B no se agrega a la ruta de clase de P. – Jake

+0

Usted no respondió la pregunta de '¿cómo lo está ejecutando?' – bmargulies

+0

@bmargulies Perdón. Genero metadatos de Eclipse y los ejecuto fuera del depurador de Eclipse. – Jake

-2

En mi caso, olvidé iniciar Eclipse con el parámetro -vm, que debería apuntar a jdk/javaw.exe.

Incluso después de 5 años de programación Java EE todavía comete errores greenhorn ...

Cuestiones relacionadas