Maven non riconosce i moduli di pari livello durante l'esecuzione di mvn dependency: tree


90

Sto cercando di impostare un progetto Maven multi-modulo e le dipendenze tra moduli apparentemente non vengono impostate correttamente.

Io ho:

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

nel POM genitore (che ha un pom di tipo packaging) e poi sottodirectory commons/e storage/che definiscono poms JAR con lo stesso nome.

Lo spazio di archiviazione dipende da Commons.

Nella directory principale (master), corro mvn dependency:treee vedo:

[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

Perché la dipendenza dai "comuni" fallisce, anche se il reattore lo ha ovviamente visto perché elabora con successo il suo albero delle dipendenze? Non dovrebbe assolutamente andare in rete per trovarlo perché è proprio lì ...

Il pom per la conservazione:

<?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>

Grazie per eventuali suggerimenti!

(Modificare)

Per chiarire, quello che sto cercando qui è questo: non voglio dover installare il modulo X per costruire il modulo Y che dipende da X, dato che entrambi sono moduli referenziati dallo stesso POM genitore. Questo ha un senso intuitivo per me che se ho due cose nello stesso albero dei sorgenti, non dovrei dover installare prodotti intermedi per continuare la compilazione. Spero che il mio pensiero abbia un senso qui ...


2
Ahhh, la modifica è perfetta. Perché non l'hai scritto nella prima intenzione? Inoltre, forse prendi in considerazione la possibilità di cambiare il titolo :) Non intendo essere pignolo, questo è solo per motivi di chiarezza e classificazione. Ciò aiuterà l'intera comunità in futuro durante la ricerca di un problema simile (che non è chiarissimo con il titolo e il contenuto effettivo che riguarda la dipendenza: albero)
Pascal Thivent,

1
Ciao. Hai trovato la soluzione? Anch'io ho questo problema :(

1
La compilazione fallisce o solo la dipendenza: solo l'obiettivo dell'albero? Vedi la risposta di Don Willis.
metamatt

OMG quindi in un modulo se fallisce perché non riesce a trovare i simboli di un altro modulo, l'altro dovrebbe essere aggiunto come dipendenza e installato come JAR? Questa è la chiave ...
WesternGun

è triste maven 3.6 non risolve ancora questo problema
yuxh

Risposte:


21

Penso che il problema sia che quando si specifica una dipendenza Maven si aspetta di averla come jar (o qualsiasi altra cosa) confezionata e disponibile almeno da un repository locale. Sono sicuro che se corri prima mvn installsul tuo progetto commons tutto funzionerà.


4
C'è un modo per specificare che voglio che usi qualunque versione del modulo sia nell'albero dei sorgenti? Ho pensato che questo caso sarebbe stato gestito automaticamente. Non voglio / non penso che Maven richieda di dover compilare-installare-costruire-installare-costruire ogni volta che voglio solo realizzare l'intero progetto!
Steven Schlansker,

38
Hai ragione che l'installazione in esecuzione lo risolve. Tuttavia, ora devo installare ogni volta che apporto modifiche, che non è quello che voglio. Voglio che il progetto di archiviazione raccolga il codice più recente dal progetto commons.
Steven Schlansker,

In realtà devo affrontare problemi simili e, ahimè, non sono in grado di trovare una risposta finora. Sembra che a Maven non importi che la dipendenza sia collegata al tuo modulo, va semplicemente al repository. Metterò il preferito sulla tua domanda, quindi forse qualche guru risponderà. Sono interessato a scoprire se questo può essere fatto
Bostone

@Steven Per favore pubblica la tua preoccupazione come un'altra domanda, non è utile rispondere in un commento e questo è un altro argomento.
Pascal Thivent,

6
Questa doveva essere la domanda principale, stavo semplicemente chiarendo. Non ho chiarito nella domanda originale che il mio intento è quello di non richiedere che i prodotti costruiti si trovino nel repository locale per costruire altri moduli nello stesso progetto?
Steven Schlansker

104

Come discusso in questo thread della mailing list esperto , l'obiettivo dependency: tree da solo cercherà le cose nel repository piuttosto che nel reattore. Puoi aggirare questo problema installando mvn, come suggerito in precedenza, o facendo qualcosa di meno oneroso che invoca il reattore, come

mvn compile dependency:tree

Per me va bene.


2
Grazie per questa soluzione economica. Ma è un bug? Mi aspetto dipendenza: l'obiettivo dell'albero si basa sul reattore senza alcun trucco.
mcoolive

Va notato che la stessa situazione si verifica per qualsiasi attività eseguita a livello globale, ma interessa solo alcuni sottoprogetti.
tkruse

Sfortunatamente, compileattiva il download delle dipendenze transitive. C'è anche un modo per elencare l'albero delle dipendenze senza scaricarli effettivamente (tranne i POM, ovviamente)?
sschuberth

Ho avuto lo stesso problema per altri obiettivi. L'aggiunta compile( validatenon è sufficiente) ha aiutato anche lì: mvn compile animal-sniffer:checkemvn compile org.basepom.maven:duplicate-finder-maven-plugin:check
msa

A seconda della build, alcuni moduli potrebbero anche avere dipendenze da artefatti che vengono compilati nelle fasi successive. Nel mio caso un file ZIP (usando maven-assembly-plugin) è stato costruito in packagefase, quindi ho dovuto fare ad es mvn package animal-sniffer:check.
msa

6

Rendendosi conto che questo è un thread più vecchio, ma sembra che lo strumento si sia evoluto o che questo potrebbe essere stato perso la prima volta.

È possibile eseguire una compilazione che risolva le dipendenze senza installare eseguendo una compilazione del reattore.

Se avvii la build nel genitore che descrive la struttura del modulo del tuo progetto, le tue dipendenze tra i tuoi moduli verranno risolte durante la build stessa attraverso il reattore Maven interno.

Ovviamente questa non è la soluzione perfetta poiché non risolve la costruzione di un singolo modulo individuale all'interno della struttura. In questo caso Maven non avrà le dipendenze nel suo reattore e cercherà di risolverlo nel repository. Quindi per le build individuali devi ancora installare prima le dipendenze.

Ecco alcuni riferimenti che descrivono questa situazione.


1
C'è un modo per costruire un singolo modulo, senza installare prima le dipendenze e senza costruire il progetto genitore completo?
È CHIUSO - Anony-Mousse

1
Per completare la risposta, se il plug-in viene richiamato direttamente (senza fasi) mvn dependency:tree, ad esempio , non risolverà comunque le dipendenze dalle fonti a meno che non si richiami la compilefase. Quindi questo dovrebbe funzionare, invece: mvn compile dependency:tree.
Stanislav Bashkyrtsev

3

per me, ciò che mi ha portato a questo thread è stato un problema simile e la soluzione è stata quella di garantire che tutte le dipendenze dai moduli di pom

 <packaging>pom</packaging>

il genitore aveva

pom

il mio dipendente modello aveva il pom - quindi non c'era nessun barattolo da trovare.


Ciò genera questo errore per me: errore di analisi durante la lettura di POM. Motivo: tag non riconosciuto: "packaging"
hithwen

modifica: volevo dire che <packaging> pom </packaging> l'ha risolto. sostituzione di <packaging> jar </packaging>
bsautner

4
Questo risolve il problema descritto nella domanda, ma ora i moduli figli non producono archivi esportabili (cioè vasi, guerre, orecchie).
sheldonh

sheldonh hai trovato una soluzione per correggere questo errore e produrre un archivio esportabile?
user3853134

3

L'unica cosa che ha funzionato per me: passare a gradle :(

io ho

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

e posso semplicemente cd in war1 e usare mvn tomcat7: run-war. Devo sempre installare l'intero progetto prima, nonostante war1 faccia riferimento al suo genitore e il genitore fa riferimento a war1 e dep1 (come moduli), quindi tutte le dipendenze dovrebbero essere conosciute.

Non capisco qual è il problema.


1
Questo è il motivo per cui utilizzo gradle quando devo creare un progetto multi-modulo. :(
Zhuo YING

2

In una struttura del modulo Maven come questa:

- parent
  - child1
  - child2

Avrai in parent pomquesto:

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

Se ora dipendi da child1in child2inserendo quanto segue nel tuo <dependencies>in child2:

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

Riceverai un errore per il quale child1non è possibile trovare il JAR . Questo può essere risolto dichiarando un <dependencyManagement>blocco incluso child1in pomfor parent:

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

child1ora verrà compilato quando esegui un obiettivo compileo packageecc. parente child2troverà child1i file compilati di.


2

Bonificando la risposta di Don Willis :

Se la tua build crea barattoli di prova per condividere il codice di prova tra i sottomoduli del tuo reattore dovresti usare:

mvn test-compile dependency:tree

che consentirà dependency:treein questo caso di essere completato.


-1

Assicurati che il modulo che sta fallendo venga risolto nel pom, stia puntando al genitore giusto includendo le configurazioni nel file pom del modulo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.