2011-05-19 14 views
34

Estoy utilizando un repositorio local como se describe en Maven: add a dependency to a jar by relative path.

El repositorio-url se define en la más alta pom.xml como

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

Además, la más alta pom.xml define 2 módulos

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

El problema es, que si un módulo (digamos sub1) define una dependencia que debe descargarse desde el repositorio, y se llama a maven desde el directorio superior, el ${basedir} no está configurado en este directorio, sino al sub1, lo que da como resultado un wro ng repository-URL.

Por lo tanto, dicen que el proyecto con la más alta pom.xml reside en

/Development/myproject/pom.xml 

Y el repositorio está en

/Development/3rdParty/maven-repository 

A continuación, la URL del repositorio debe establecerse en

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

pero resulta que está configurado en

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

que por supuesto no existe.

¿Alguna idea de por qué es así?

+0

¿Por qué no utiliza un administrador de repositorios para mantener sus artefactos? – khmarbaise

+0

Según su información, su compilación no es confiable ni reproducible. Este es un no ir para una construcción. – khmarbaise

Respuesta

21

Aunque es molesto en su caso, esto es conocido e intencional. Un proyecto de maven solo debe conocer su directorio de ejecución, sin importar en qué contexto se ejecute.

Pregunté casi la misma pregunta: Maven variable for reactor root antes, y la única respuesta que tenía sentido era to use ${user.dir}, aunque es raro y no funcionará si compila desde un directorio de módulos.

(Se da también una solución muy detallado: Maven2 property that indicates the parent directory)

3

¿Qué hay de tener múltiples repositorios?

<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> 
+1

Esto funciona ... pero creo que puede crear directorios "ibm-jars-bundle/repo" innecesarios en directorios secundarios al buscar una dependencia local ya que se intenta primero la primera definición de repositorio (ibm-jars-bundle-lv0) que busca en la raíz del directorio hijo actual y crea el directorio si no existe. – sdoxsee

Cuestiones relacionadas