web-dev-qa-db-fra.com

Utilisation de maven $ {basedir} dans une configuration multi-modules

J'utilise un référentiel local comme décrit dans Maven: ajouter une dépendance à un pot par chemin relatif .

L'URL du référentiel est définie dans la partie supérieure pom.xml as

<url>file:${basedir}/../3rdParty/maven-repository</url>

En outre, le plus haut pom.xml définit 2 modules

<modules>
    <module>sub1</module>
    <module>sub2</module>
</modules>

Le problème est que si un module (disons sub1) définit une dépendance qui doit être téléchargée à partir du référentiel, et maven est appelé à partir du répertoire le plus haut, le ${basedir} n'est pas défini sur ce répertoire, mais sur sub1, entraînant une URL de référentiel incorrecte.

Alors, disons que le projet avec le plus haut pom.xml Réside dans

/Development/myproject/pom.xml

Et le référentiel est en

/Development/3rdParty/maven-repository

Ensuite, l'URL du référentiel doit être définie sur

/Development/myproject/../3rdParty/maven-repository

mais il s'avère qu'il est réglé sur

/Development/myproject/sub1/../3rdParty/maven-repository

qui bien sûr n'existe pas.

Une idée pourquoi c'est le cas?

38
thomers

Bien que cela soit ennuyeux dans votre cas, c'est bien connu et intentionnel. Un projet maven ne doit connaître que son répertoire d'exécution, quel que soit le contexte dans lequel il est exécuté.

J'ai posé presque la même question: variable Maven pour la racine du réacteur plus tôt, et la seule réponse qui avait du sens était pour utiliser ${user.dir} , bien que ce soit hacky et ne fonctionnera pas si vous construisez à partir d'un répertoire de modules.

(Il existe également cette solution très détaillée: propriété Maven2 qui indique le répertoire parent )

24

Que diriez-vous d'avoir plusieurs référentiels?

<repositories>
    <repository>
        <id>ibm-jars-bundle-lv0</id>
        <url>file://${basedir}/ibm-jars-bundle/repo</url>
    </repository>
    <repository>
        <id>ibm-jars-bundle-lv1</id>
        <url>file://${basedir}/../ibm-jars-bundle/repo</url>
    </repository>
    <repository>
        <id>ibm-jars-bundle-lv2</id>
        <url>file://${basedir}/../../ibm-jars-bundle/repo</url>
    </repository>
</repositories>
3
basin

J'ai déjà posé une question similaire concernant le répertoire du projet parent.

Vous pouvez voir le fil ici: propriété Maven2 qui indique le répertoire parent

2
Romain Linsolas