Domanda

I colleghi hanno propagandato le meraviglie della maven e delle sue magiche cose di dipendenza, ma sto scoprendo che fallisce in quello che considererei l'uso ovvio.

Supponiamo di avere una cartella radice con un POM principale.

Quindi sotto ho alcuni progetti, chiamali A e B

B richiede A e quindi il POM nella cartella B ha la voce di dipendenza appropriata in esso

Ora, di nuovo nella cartella principale, in un profilo, specifico che voglio costruire B.

Quando eseguo la solita installazione di mvn clean, ottengo un errore perché A non è stato creato.

I miei amici mi dicono che devo specificare sia A che B in quel profilo principale nella radice.

Ma non è l'intero punto della gestione delle dipendenze che Mavvenir vede B, va nel file B POM dove vede la dipendenza da A e quindi dovrebbe andare a costruire automaticamente A

È stato utile?

Soluzione

Un motivo per cui riesco a pensare che il tuo comportamento desiderato non sia stato implementato è il seguente:

Supponiamo che sto lavorando su entrambi i progetti A e B. Attualmente A è rotto. Se la risoluzione delle dipendenze si verificasse come desideri, non sarei mai in grado di creare B fino a quando A non fosse stato risolto. Quindi devo ripristinare le mie modifiche ad A, oppure concentrarmi sulla correzione di A prima. In ogni caso, probabilmente non è quello su cui voglio concentrarmi adesso.

Generalmente B vuole lavorare con il " ultimo buon " versione di A, piuttosto che l'ultima. L'uso delle dipendenze dal repository significa che almeno hanno compilato ok (e speriamo che anche i test unitari siano stati eseguiti).

Altri suggerimenti

Con il POM principale:

~/scratch/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>scratch</groupId>
    <artifactId>scratch</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>nipple</module>
        <module>cabbage</module>
    </modules>
</project>

E i moduli POM:

~/scratch/nipple/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">

    <parent>
        <artifactId>scratch</artifactId>
        <groupId>scratch</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>scratch</groupId>
    <artifactId>nipple</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

~/scratch/cabbage/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">

    <parent>
        <artifactId>scratch</artifactId>
        <groupId>scratch</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>scratch</groupId>
    <artifactId>cabbage</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>scratch</groupId>
            <artifactId>nipple</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

Posso emettere mvn package nella directory principale dopo aver cancellato il mio repository locale e finire con tutti i moduli creati. (In JAR vuoti, ma costruiti.)

Maven sembra cercare dipendenze nel repository o nella build in corso. Non attraverserà automaticamente la struttura del tuo progetto quando stai costruendo un singolo modulo, perché non è necessario che tu abbia anche il progetto principale sul tuo computer, tanto meno una directory sopra il modulo corrente. (La relazione genitore-figlio non è nemmeno biiettiva.)

Un motivo per cui ciò potrebbe essere dovuto al fatto che un layout di directory in cui la posizione dei moduli sarebbe prevedibile non è in alcun modo obbligatorio. È persino abbastanza comune e accettabile che il layout dell'esempio sopra sia così:

projects
|
+--scratch
|  |
|  +--scratch-parent
|  |  |
|  |  +--pom.xml [The POM of scratch:scratch:1.0-SNAPSHOT]
|  |
|  +--nipple
|  |  |
|  |  +--pom.xml [The POM of scratch:mod1:1.0-SNAPSHOT]
|  |
|  +--cabbage
|  |  |
|  |  +--pom.xml [The POM of scratch:mod2:1.0-SNAPSHOT]

In questo caso, la sezione <modules> del POM principale sarebbe:

<modules>
    <module>../nipple</module>
    <module>../cabbage</module>
</modules>

Nota che non c'è nulla che dice quale ID artefatto si trova in quale modulo. Serve solo a dire a Maven che si tratta di posizioni dei filesystem dove cercare altri artefatti relativi a questa build.

Dai un'occhiata al Plugin del reattore Maven , in reattore particolare: make, che costruisce un modulo e tutti i moduli da cui dipende.

Rich ha perfettamente ragione. Quello che descrivi generalmente non è il comportamento previsto. Sebbene, come affermato da deterb, il reattore di Maven supporta build parziali se i moduli sono conosciuti dal genitore POM .

Costruire con mvn install -pl B -am dovrebbe rendere anche (-am) le dipendenze di B (cioè A).

Comunque, il modulo A deve essere un modulo del POM principale.

(vedi Moduli Maven + Creazione di un singolo modulo specifico )

Se lavori con IntelliJ, hanno una piccola casella di spunta magica: " Risolvi artefatti dell'area di lavoro " nella loro configurazione di esecuzione Maven. Quindi non è necessario installare né compilare dal genitore.

La risposta è solo che non è il modo in cui Maven funziona. L'idea alla base di Maven è quella di fornire allo sviluppatore un sistema logico e semplice per il controllo delle dipendenze. Ottenere le dipendenze dal repository è la chiave per questo. Ogni eccezione indebolisce questo controllo e semplicità. L'aggiunta di A come dipendenza nel POM principale risolve completamente lo scenario senza aggiungere ulteriori eccezioni. L'uso di file batch o script di formiche è un altro modo per affrontare il tuo scenario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top