Pregunta

Estoy intentando configurar un proyecto Maven de varios módulos y aparentemente las dependencias entre módulos no se están configurando correctamente.

Tengo:

<modules>
  <module>commons</module>
  <module>storage</module>
</modules>

en la POM principal (que tiene una pom de tipo envase) y luego subdirectorios commons/ y storage/ que definen los pompones JAR con el mismo nombre.

El almacenamiento depende de los comunes.

En el directorio principal (maestro), ejecuto mvn dependency:tree y ver:

[INFO] Building system
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] domain:system:pom:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------
[INFO] Building commons
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
...correct tree...
[INFO] ------------------------------------------------------------------------
[INFO] Building storage
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
Downloading: http://my.repo/artifactory/repo/domain/commons/1.0-SNAPSHOT/commons-1.0-SNAPSHOT.jar
[INFO] Unable to find resource 'domain:commons:jar:1.0-SNAPSHOT' in repository my.repo (http://my.repo/artifactory/repo)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) domain:commons:jar:1.0-SNAPSHOT

¿Por qué falla la dependencia de los "bienes comunes", aunque el reactor obviamente lo ha visto porque procesa con éxito su árbol de dependencia?Definitivamente no debería ir a la red para encontrarlo ya que está ahí mismo...

El pompón para almacenamiento:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <packaging>jar</packaging>
  <parent>
    <artifactId>system</artifactId>
    <groupId>domain</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>domain</groupId>
  <artifactId>storage</artifactId>
  <name>storage</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <!-- module dependencies -->
    <dependency>
      <groupId>domain</groupId>
      <artifactId>commons</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

    <!-- other dependencies -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

¡Gracias por cualquier sugerencia!

(Editar)

Para aclarar, lo que estoy buscando aquí es esto:No quiero tener que instalar el módulo X para construir el módulo Y que depende de X, dado que ambos son módulos a los que se hace referencia desde el mismo POM principal.Para mí, esto tiene sentido intuitivo: si tengo dos cosas en el mismo árbol fuente, no debería tener que instalar productos intermedios para continuar con la compilación.Ojalá mi pensamiento tenga algún sentido aquí...

¿Fue útil?

Solución

Creo que el problema es que cuando especificas una dependencia, Maven espera tenerla como jar (o lo que sea) empaquetada y disponible desde al menos un repositorio local.Estoy seguro de que si corres mvn install En su proyecto de bienes comunes primero todo funcionará.

Otros consejos

Como se discutió en este correo experta lista de hilos , la dependencia: objetivo árbol por sí mismo va a buscar cosas en el repositorio en lugar del reactor. Puede solucionar esto mediante la instalación de MVN, como se sugirió anteriormente, o hacer algo menos oneroso que invoca el reactor, como

mvn compile dependency:tree

A mí me funciona.

Al darse cuenta de esto es un hilo viejo, pero parece que, o bien la herramienta o evolucionó esto podría haberse perdido la primera vez.

Es posible realizar una compilación que hace que las dependencias resueltas sin necesidad de instalar haciendo una acumulación del reactor.

Si se inicia su construcción en el padre que describe la estructura del módulo de su proyecto a continuación se resolverán sus dependencias entre los módulos durante la construcción en sí a través del reactor Maven interno.

Por supuesto, esta no es la solución perfecta, ya que no resuelve la acumulación de un solo módulo individual dentro de la estructura. En este caso Maven no tendrá las dependencias en su reactor y se abeja en busca de resolverlo en el repositorio. Por lo tanto para el individuo construye todavía tiene que instalar las dependencias primero.

Aquí es un poco de referencia describir esta situación.

para mí, lo que me llevó a este hilo era un problema similar y la solución era para asegurar que todos pom dependencia de módulos de tenían

 <packaging>pom</packaging>

el padre tenía

pom

mi modelo de dep tenía pom - así que no había frasco que se encuentran

.

Lo único que workd para mí: el cambio a Gradle: (

Tengo

Parent
  +---dep1
  +---war1 (using dep1)

y sólo puedo cd en war1 y utilizar mvn tomcat7: gestión guerra. Siempre tengo que instalar todo el proyecto antes de que, a pesar de war1 hace referencia a su padre y el padre referencias war1 y DEP1 (como módulos) para todas las dependencias deben ser conocidos.

No entiendo cuál es el problema.

En una estructura de módulos Maven como esto:

- parent
  - child1
  - child2

Se tendrá en el parent pom esto:

<modules>
  <module>child1</module>
  <module>child2</module>
</modules>

Si ahora depende de child1 en child2 poniendo lo siguiente en su <dependencies> en child2:

<dependency>
  <groupId>example</groupId>
  <artifactId>child1</artifactId>
</dependency>

Usted recibirá un error que el JAR para child1 no se puede encontrar. Esto se puede resolver por la que se declara un bloque <dependencyManagement> incluyendo child1 en el pom para parent:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>example</groupId>
      <artifactId>child1</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

child1 ahora será construir cuando se ejecuta una compile o meta package etc., sobre parent y child2 encontrará archivos compilados de child1.

Bonusing de la responder de Don Willis :

Si su acumulación crea ensayo frascos para compartir código de prueba entre los submódulos del reactor se debe utilizar:

mvn test-compile dependency:tree

lo que permitirá a dependency:tree se termina de ejecutar en este caso.

Asegúrese de que el módulo que está fallando se resuelve en el POM, está apuntando a la derecha de los padres mediante la inclusión de las configuraciones en el archivo pom del módulo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top