NastyDiaper
NastyDiaper

Reputation: 2558

Using multiple Maven mirrors to pull different jar version into a project

I am experiencing issues pulling in a new version of a library which lives in a different repository. I believe I have to update my settings.xml and my parent level pom.xml which specifies the new version.

Currently my settings.xml reads like the following:

<settings>
   <mirrors>
      <mirror>
         <id>nexus</id>
         <url>http://serenity.gm.edu/nexus/content/groups/public/</url>
         <mirrorOf>central</mirrorOf>
      </mirror>
      <mirror>
         <id>mods</id>
         <url>http://7.169.72.8:8081/nexus/content/repositories/releases/</url>
         <mirrorOf>central</mirrorOf>
      </mirror>
  </mirrors>
  <profiles>
     <profile>
        <id>default</id>
        <repositories>
           <repository>
              <id>mod-thirdparty</id>
              <url>http://7.169.72.8:8081/nexus/content/repositories/thridparty/</url>
           </repository>
           <repository>
              <id>mod-snapshots</id>
              <url>http://7.169.72.8:8081/nexus/content/repositories/snapshots/</url>
           </repository>
       </repositories>
   </profile>
</profiles>

<servers>
   <server>
      <id>Tomcat</id>
      <username>admin</username>
      <password>xxx</password>
   </server>
</servers>

The default mirror where everything gets pulled in from is serenity. I am trying to pull in a custom library mod3.2 from 7.169.72.8 but version 2.3 keeps getting pulled in from serenity. I have tried a number of <mirrorOf> settings such as *,!central with no success.

My parent pom.xml is fairly straightforward defining a list of modules, proerties, and global dependencies. Here are the items of interest (it is too long to show).

<project ...>
...
<distributionManagement>
   <repository>
      <id>releases</id>
      <name>mod2-releases</name>
         <url>http://7.169.72.8:8081/nexus/content/repositories/releases</url>
   </repository>
   <snapshotRepository>
      <id>snapshots</id>
      <name>mod2-snapshots</name>
         <url>http://7.169.72.8:8081/nexus/content/repositories/snapshots</url>
   </snapshotRepository>
</distributionManagement>

<properties>
    ...
    <mod2.version>3.2</mod2.version>
    ...
</properties>

    ...

<dependencyManagement>
   <dependencies>
      <dependency>
         <groupId>mod2.commons</groupId>
         <artifactId>mod2.commons.lang</groupId>
         <version>${mod2.version}</version>
      </dependency>
      <dependency>
         <groupId>mod2.commons</groupId>
         <artifactId>mod2.commons.audit</groupId>
         <version>${mod2.version}</version>
      </dependency>
    </dependencies>
</dependencyManagement>
</project>

To recap - I'm trying to get version mod2 version 3.2 from 7.169.72.8 but all I can pull in mod2 version 2.3 from the serenity repo. Thanks for any help.

Upvotes: 1

Views: 3644

Answers (1)

Tunaki
Tunaki

Reputation: 137064

In your configuration, you are declaring multiple mirrors for the Central repository. However, Maven does not support that:

Note that there can be at most one mirror for a given repository. In other words, you cannot map a single repository to a group of mirrors that all define the same value. Maven will not aggregate the mirrors but simply picks the first match. If you want to provide a combined view of several repositories, use a repository manager instead.

In your case, Maven is picking the first mirror of Central, which is of id nexus, and ignoring the second one, which is of id mods. Therefore, when fetching for your artifact, it only searches nexus and fails to find it.

There are a couple of solutions:

  • If you really want to have multiple mirrors for the same repository, you will need to use a repository manager and configure this on the repo manager itself.
  • It's not clear why you need to mirror Central and point to 7.169.72.8:8081 if this repository doesn't have all the artifacts needed to make your build work. If the rest are hosted on serenity.gm.edu, you could host all of them on serenity.gm.edu.
  • You could also not use the mods mirror at all. Let serenity.gm.edu be the mirror for Central and just declare a new repository that isn't Central to fetch your artifacts. You already declared the mod-thirdparty and mod-snapshots repositories, so this is a matter of activating the profile they are under with:

    <activeProfiles>
      <activeProfile>default</activeProfile>
    </activeProfiles>
    

    in the settings.xml. With this, Maven will also look for your artifacts at the URL configured for those repo (and those are not mirrored by nexus).

Upvotes: 1

Related Questions