Search code examples
mavenmaven-3

How to disable maven blocking external HTTP repositories?


Maven blocks external HTTP repositories by default since version 3.8.1 (see https://maven.apache.org/docs/3.8.1/release-notes.html)

Is there a way to disable that or to exempt a repository from this rule?


Solution

  • I found a solution to do this by inspecting the commit in the Maven git repository that is responsible for the default HTTP blocking: https://github.com/apache/maven/commit/907d53ad3264718f66ff15e1363d76b07dd0c05f

    My solution is as follows:

    In the Maven settings (located in ${maven.home}/conf/settings.xml or ${user.home}/.m2/settings.xml), the following entry must be removed:

    <mirror>
      <id>maven-default-http-blocker</id>
      <mirrorOf>external:http:*</mirrorOf>
      <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
      <url>http://0.0.0.0/</url>
    </mirror>
    

    If you work in a project and cannot make sure the Maven settings are always like that, e.g. because you share code with other people or want to use CI/CD with automated testing, you may do the following: Add a directory named .mvn in the project. In the .mvn directory, add a file named maven.config with the content --settings=./.mvn/local-settings.xml. In the .mvn directory, add a file named local-settings.xml. This file should look like this:

    <settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
        <mirrors>
            <mirror>
                <id>my-repository-http-unblocker</id>
                <mirrorOf>my-blocked-http-repository</mirrorOf>
                <name></name>
                <url>http://........</url>
            </mirror>
        </mirrors>
    </settings>
    

    Where inside the <mirrorOf> tag, you need to specify the id of the blocked repository, and in the <url> tag, you specify the original url of the repository again. You need to create this unblocker mirror for every repository you have that is blocked.

    The file .mvn/maven.config should look like this:

    --settings=./.mvn/local-settings.xml
    

    Example:

    If you have the following HTTP repositories defined in the pom.xml:

    <repositories>
        <repository>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <id>central</id>
            <name>libs-release</name>
            <url>http://my-url/libs-release</url>
        </repository>
        <repository>
            <id>snapshots</id>
            <name>libs-snapshot</name>
            <url>http://my-url/libs-snapshot</url>
        </repository>
    </repositories>
    

    Then you need in the .mvn/local-settings.xml:

    <settings>
        <mirrors>
            <mirror>
                <id>release-http-unblocker</id>
                <mirrorOf>central</mirrorOf>
                <name></name>
                <url>http://my-url/libs-release</url>
            </mirror>
            <mirror>
                <id>snapshot-http-unblocker</id>
                <mirrorOf>snapshots</mirrorOf>
                <name></name>
                <url>http://my-url/libs-snapshot</url>
            </mirror>
        </mirrors>
    </settings>
    

    I hope my work can help other people who stumble upon this. However, if you have a more elegant or better solution, please share!