tuk
tuk

Reputation: 6872

Order of maven repositories in settings.xml

I have a settings.xml which looks like below:-

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
   <servers>
      <server>
         <id>nReleases</id>
         <username>test</username>
         <password>test123</password>
      </server>
      <server>
         <id>nSnapshots</id>
         <username>test</username>
         <password>test123</password>
      </server>
   </servers>

<profiles>
    <profile>
        <id>space</id>
        <repositories>
           <repository>
                <id>central</id>
                <url>http://repo1.maven.org/maven2</url>
            </repository>
            <repository>
                <id>nReleases</id>
                <name>Releases</name>
                <url>http://someserver/repository/maven-releases/</url>
            </repository>
           <repository>
                <id>nSnapshots</id>
                <name>Snapshots</name>
                <url>http://someserver/repository/maven-snapshots/</url>
            </repository>
        </repositories>
    </profile>
</profiles>

<activeProfiles>
    <activeProfile>space</activeProfile>
</activeProfiles>
</settings>

I want maven to check repo1.maven.org first and then only look in someserver. Can someone let me know how this can be achieved?

I am using Maven 3.3.9.

I have gone through this question and tried to change the order in which repos are declared in profile but it did not help.

<profile>
    <id>space</id>
    <repositories>   
        <repository>
            <id>nReleases</id>
            <name>Releases</name>
            <url>http://someserver/repository/maven-releases/</url>
        </repository>
        <repository>
            <id>nSnapshots</id>
            <name>Snapshots</name>
            <url>http://someserver/repository/maven-snapshots/</url>
        </repository>
        <repository>
            <id>central</id>
            <url>http://repo1.maven.org/maven2</url>
        </repository>
    </repositories>
</profile>

Logs while doing mvn clean install

tuk-MacBook-Pro-4:camel tuk$ mvn clean install
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building camel 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: http://someserver/repository/maven-releases/org/apache/camel/camel-redis/2.16.3/camel-redis-2.16.3.pom
Downloading: http://someserver/repository/maven-snapshots/org/apache/camel/camel-redis/2.16.3/camel-redis-2.16.3.pom

Upvotes: 3

Views: 4896

Answers (1)

Tunaki
Tunaki

Reputation: 137289

The order of the repository inside the settings was not clearly specified in Maven 2, but starting with Maven 3 (and the fix of of MNG-4400), the repositories are always tried in their declaration order in the settings.

What can happen, and what is likely the cause of your problem, is that Maven tries a repository, fails in doing so, and stores in your local repository the fact that it tried and failed. This results in the creation of .lastUpdated files in your local repository, storing this information. The consequence is that Maven will not re-try to download the dependency from a repository where it knows the download failed in the past. Thus, when you start a command and the project requires an artifact not present in your local repository, Maven will still try the repositories in their order of declaration, but it will skip the ones it knows already failed.

But you can force it to bypass this mechanism by passing the -U flag on the command line. It forces Maven to update the releases and snapshots dependencies, without looking into .lastUpdated files. This way, it will re-try every active remote repositories.

Upvotes: 5

Related Questions