2015-04-18 22 views
19

Quando si esegue comandi comeMaven non può risolvere dipendenza per modulo stesso progetto multi-modulo

mvn dependency:build-classpath 

o

mvn exec:java 

Maven non riesce a risolvere una dipendenza di uno dei miei moduli su un altro.

[ERRORE] Impossibile eseguire obiettivo sul progetto parser-app: Impossibile risolvere le dipendenze per progetto project_group: A: vaso: 0.1-SNAPSHOT: Impossibile trovare project_group artefatto: B: vaso: 0.1-SNAPSHOT

La struttura del progetto è la seguente:

/pom.xml 
/A/pom.xml 
/B/pom.xml 

Il pom genitore è il seguente:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>project_group</groupId> 
    <artifactId>parent</artifactId> 
    <packaging>pom</packaging> 
    <version>0.1-SNAPSHOT</version> 
    <name>parent</name> 

    <modules> 
    <module>A</module> 
    <module>B</module> 
    </modules> 

Il primo modulo bambino (quello non riuscendo a risolvere la dipendenza):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>parent_group</groupId> 
    <artifactId>parent</artifactId> 
    <version>0.1-SNAPSHOT</version> 
    </parent> 
    <artifactId>A</artifactId> 
    <packaging>jar</packaging> 
    <name>A</name> 

    <dependencies> 
    <dependency> 
     <groupId>parent_group</groupId> 
     <artifactId>B</artifactId> 
     <version>0.1-SNAPSHOT</version> 
    </dependency> 

Il secondo modulo del bambino (la dipendenza):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>parent_group</groupId> 
    <artifactId>parent</artifactId> 
    <version>0.1-SNAPSHOT</version> 
    </parent> 
    <artifactId>B</artifactId> 
    <packaging>jar</packaging> 
    <name>B</name> 
+0

provare scambiando la struttura di generazione, voglio dire riscrivere il pom.xml avere B A. Le classi nel modulo A richiedono classi dal modulo B, quindi B deve essere costruita prima –

+1

nessuna modifica, per quanto ne so il reattore dovrebbe risolvere l'ordine dalle dipendenze –

+0

Correggere il reattore dovrebbe gestire l'ordine di costruzione. Non è necessaria alcuna maneggevolezza né deve essere eseguita. – khmarbaise

risposta

28

Hai passato mvn clean install almeno una volta sul progetto per installa le dipendenze nel tuo repository locale?

+1

Che ha funzionato. Ciò significa che dovrei eseguire l'installazione ogni volta che aggiorno il modulo dipendente giusto? Supponevo che ci fosse un modo per usare la copia di recente costruzione (cioè root/B/target/B-0.1-SNAPSHOT.jar) –

+0

Penso che quello che stai cercando sia: http: // StackOverflow.it/questions/4367665/java-maven-rebuild-dependency La maggior parte dei metodi per farlo sono meno ben documentati, tuttavia come Maven si basa sul modello di dipendenza in cui le dipendenze sono installate nel repository locale –

+1

Posso mvn pacchetto e avere i pacchetti si costruiscono uno contro l'altro, tuttavia ho ipotizzato che altre azioni (come la generazione del classpath o dell'esecuzione) usassero anche i pacchetti creati più di recente, non l'ultima volta che ho installato sul mio repository locale. Immagino che questo potrebbe essere solo un compromesso con cui devo convivere? –

8

Il reattore Maven è strano in quel modo, mantiene i moduli solo per determinati compiti. Quando si esegue un obiettivo di build che fa qualcosa solo per un sottoprogetto, allora se Maven crea prima le dipendenze, non le mantiene nel reattore (a volte).

L'installazione nel repository locale è una soluzione, ma è orribile e dovrebbe essere evitata quando possibile, perché è possibile finire facilmente con risultati di build obsoleti.

Una soluzione leggermente meno brutta consiste nel combinare due target di build, in cui il secondo target di build fa qualcosa di innocuo, ma attiva l'aggiunta al reattore in tutti i sottoprogetti.

Ad esempio è possibile combinare l'attività desiderata con le attività "Compile" o "Pacchetto".

vedere anche più alto votato risposta a Maven doesn't recognize sibling modules when running mvn dependency:tree