Saltar al contenido

Maven no reemplaza una variable en ‘settings.xml’ cuando se invoca

Solución:

La sustitución de propiedades en settings.xml no funciona como cabría esperar.

Sustituirá las propiedades dentro del elemento de perfiles (como lo ha visto, se sustituye en la URL de su repositorio, que se definiría dentro de un perfil), pero no a elementos fuera de los perfiles (como ha visto que sucede en la sección de espejos). Esta distinción se hace porque el elemento de perfil en settings.xml es una versión truncada del elemento de perfil pom.xml. Es un mecanismo que permite establecer la configuración en su POM, por lo que se permite la sustitución de propiedades dentro de los elementos de los perfiles, ya que son efectivamente parte del POM.

Las partes de la configuración fuera del elemento de perfiles representan la configuración de la plataforma, no se supone que se vean afectadas por las compilaciones individuales, por lo que no se sustituyen por las propiedades de la línea de comandos. Esto tiene sentido, pero en realidad no se aclara en ninguna parte.

EDITAR: en la página de configuración de la documentación de mavens, en la última oración de la sección de descripción general rápida (bastante oculta) dice:

Tenga en cuenta que las propiedades definidas en los perfiles dentro de settings.xml no se pueden utilizar para la interpolación.


Sin embargo, hay una solución alternativa, puede sustituir Variables de entorno en settings.xml. Si establece la variable de entorno:

set M2_MIRROR=D:test

y configure la URL del repositorio de la siguiente manera:

<url>file://${M2_MIRROR}/maven/.m2/repository</url>

Luego, invoque Maven como de costumbre, la variable de entorno se sustituye y su compilación debería funcionar según sea necesario.

Esta es una pregunta antigua ahora, pero a partir de Maven 3, y probablemente antes, puede hacer referencia a las variables de entorno, si tiene el prefijo ‘env

Lo hago así:

  <localRepository>${env.M2_LOCAL_REPO}</localRepository>

Luego, cada desarrollador establece M2_LOCAL_REPO a una ubicación apropiada.

Tuve una experiencia un poco diferente aquí de la respuesta de Rich, así que creo que vale la pena mencionarla en otra diferente.

De hecho, la sustitución de variables funciona dentro de un perfil, pero parece fallar si los necesita reemplazados antes de que ocurra la resolución del pom principal.

Tenía la siguiente configuración aquí:

<profiles>
  <profile>
    <id>company-dev</id>
    <properties>
      <company.repo.deployment.endpoint>https://companyartifacts.jfrog.io/companyartifacts</company.repo.deployment.endpoint>
      <company.repo.download.endpoint>https://companyartifacts.jfrog.io/companyartifacts</company.repo.download.endpoint>
    </properties>
    <repositories>
      ...
      <repository>
        <id>company-repo-snap</id>
        <name>libs-snapshots</name>
        <url>${company.repo.download.endpoint}/libs-snapshots</url>
        <snapshots>
          <enabled>true</enabled>
        </snapshots>
        <releases>
          <enabled>false</enabled>
        </releases>
      </repository>
    </repositories>
    </pluginRepositories>
  </profile>
</profiles>

Ha sido así durante años, cada lugar donde uso company.repo.download.endpoint var parece funcionar muy bien hasta que lo necesité para resolver un pom principal como este:

<project ...>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.company.jcompany</groupId>
        <artifactId>persistence</artifactId>
        <version>5-SNAPSHOT</version>
    </parent>
    <artifactId>persistence-api</artifactId>
    <version>5.0.0-SNAPSHOT</version>
    ...
</project>

Luego, comencé a tener esta excepción, incluso ejecutando algo tan simple como mvn -X help:effective-pom solamente:

(las variables de aviso no se reemplazan en la URL)

[ERROR]   The project com.company.jcompany:persistence-api:5.0.0-SNAPSHOT (/var/lib/jenkins/jobs/jcompany_persistence_api-trunk/workspace/pom.xml) has 1 error
[ERROR]     Non-resolvable parent POM: Could not transfer artifact com.company.jcompany:persistence:pom:5-SNAPSHOT from/to company-repo-snap (${company.repo.download.endpoint}/libs-snapshots): No connector available to access repository company-repo-snap (${company.repo.download.endpoint}/libs-snapshots) of type default using the available factories WagonRepositoryConnectorFactory and 'parent.relativePath' points at wrong local POM @ line 5, column 10 -> [Help 2]
org.apache.maven.model.resolution.UnresolvableModelException: Could not transfer artifact com.company.jcompany:persistence:pom:5-SNAPSHOT from/to company-repo-snap (${company.repo.download.endpoint}/libs-snapshots): No connector available to access repository company-repo-snap (${company.repo.download.endpoint}/libs-snapshots) of type default using the available factories WagonRepositoryConnectorFactory
    at org.apache.maven.project.ProjectModelResolver.resolveModel(ProjectModelResolver.java:159)
    at org.apache.maven.model.building.DefaultModelBuilder.readParentExternally(DefaultModelBuilder.java:813)
    at org.apache.maven.model.building.DefaultModelBuilder.readParent(DefaultModelBuilder.java:664)
    at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:310)
    at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:232)

La única explicación razonable que encuentro para este problema es que la resolución del pom principal ocurre tan temprano en el proceso que las variables aún no se reemplazan. Cuando no tengo que buscar instantáneas para poms padre, todas las variables se reemplazan correctamente, como se esperaba. No estoy seguro de si debería informar de esto como un error.

Usando Maven 3.6.3 en el momento de la respuesta, si eso importa.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *