Обход maven-default-http-blocker

Как обойти блокировку репозитория, который настроен только для работы по HTTP протоколу.

Причины возникновения проблемы

Используя Maven 3.8.1 или более позднюю версию, можно столкнуться с ошибкой.

 1$ mvn clean package -s ~/.m2/settings-with-http.xml
 2Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
 3[INFO] Scanning for projects...
 4[INFO]
 5[INFO] -------------------< dev.akorolev.maven:simple-pom >--------------------
 6[INFO] Building simple-pom 0.1.0
 7[INFO]   from pom.xml
 8[INFO] --------------------------------[ jar ]---------------------------------
 9[INFO] ------------------------------------------------------------------------
10[INFO] BUILD FAILURE
11[INFO] ------------------------------------------------------------------------
12[INFO] Total time:  0.287 s
13[INFO] Finished at: 2024-03-21T07:31:59+04:00
14[INFO] ------------------------------------------------------------------------
15[ERROR] Failed to execute goal on project simple-pom: Could not resolve dependencies for project dev.akorolev.maven:simple-pom:jar:0.1.0:
16 Failed to collect dependencies at dev.akorolev.front:app:jar:6.2.0: Failed to read artifact descriptor for dev.akorolev.front:app:jar:6.2.0:
17 The following artifacts could not be resolved: dev.akorolev.front:app:pom:6.2.0 (absent):
18 Could not transfer artifact dev.akorolev.front:app:pom:6.2.0 from/to maven-default-http-blocker (http://0.0.0.0/):
19 Blocked mirror for repositories: [private-nexus-common (http://akorolev.dev:9083/repository/common/, default, releases)] -> [Help 1]
20[ERROR]
21[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
22[ERROR] Re-run Maven using the -X switch to enable full debug logging.
23[ERROR]
24[ERROR] For more information about the errors and possible solutions, please read the following articles:
25[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException

Данное поведение отражено в примечаниях к выпуску 3.8.1 как исправление CVE-2021-26291 . И первым вариантом решения проблемы предлагается мигрировать с HTTP на HTTPS протокол. Только в большинстве случаев такие репозитории находятся вне нашего влияния, что делает обновление невозможным.

Что такое maven-default-http-blocker

Maven использует наследование не только в рамках построения эффективного POM, также существует понятие эффективного файла настроек.

 1$ mvn help:effective-settings -s ~/.m2/settings-with-http.xml -Doutput=effective-settings.xml
 2Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
 3[INFO] Scanning for projects...
 4[INFO]
 5[INFO] -------------------< dev.akorolev.maven:simple-pom >--------------------
 6[INFO] Building simple-pom 0.1.0
 7[INFO]   from pom.xml
 8[INFO] --------------------------------[ jar ]---------------------------------
 9[INFO]
10[INFO] --- help:3.4.0:effective-settings (default-cli) @ simple-pom ---
11[INFO] Effective-settings written to: D:\repositories\articles\maven\effective-settings.xml
12[INFO] ------------------------------------------------------------------------
13[INFO] BUILD SUCCESS
14[INFO] ------------------------------------------------------------------------
15[INFO] Total time:  0.957 s
16[INFO] Finished at: 2024-03-20T15:23:44+04:00
17[INFO] ------------------------------------------------------------------------
 1<?xml version="1.0" encoding="UTF-8"?>
 2<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
 5
 6    <localRepository>D:/.m2/local_repository</localRepository>
 7    <profiles>
 8        <profile>
 9            <activation>
10                <activeByDefault>true</activeByDefault>
11            </activation>
12            <repositories>
13                <repository>
14                    <id>private-nexus-common</id>
15                    <name>Репозиторий релизных артефактов</name>
16                    <url>http://akorolev.dev:9083/repository/common/</url>
17                    <releases>
18                        <enabled>true</enabled>
19                    </releases>
20                    <snapshots>
21                        <enabled>false</enabled>
22                    </snapshots>
23                </repository>
24            </repositories>
25        </profile>
26    </profiles>
27</settings>
28 
 1<?xml version="1.0" encoding="UTF-8"?>
 2<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
 4    <localRepository>D:\.m2\local_repository</localRepository>
 5    <mirrors>
 6        <mirror>
 7            <mirrorOf>external:http:*</mirrorOf>
 8            <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
 9            <url>http://0.0.0.0/</url>
10            <blocked>true</blocked>
11            <id>maven-default-http-blocker</id>
12        </mirror>
13    </mirrors>
14    <profiles>
15        <profile>
16            <repositories>
17                <repository>
18                    <id>private-nexus-common</id>
19                    <name>Репозиторий релизных артефактов</name>
20                    <url>http://akorolev.dev:9083/repository/common/</url>
21                    <releases/>
22                    <snapshots>
23                        <enabled>false</enabled>
24                    </snapshots>
25                </repository>
26            </repositories>
27            <activation>
28                <activeByDefault>true</activeByDefault>
29            </activation>
30        </profile>
31    </profiles>
32    <pluginGroups>
33        <pluginGroup>org.apache.maven.plugins</pluginGroup>
34        <pluginGroup>org.codehaus.mojo</pluginGroup>
35    </pluginGroups>
36</settings>

Эффективные настройки — это результат объединения настроек уровня системы и уровня пользователя. Первые описаны в файле conf/settings.xml внутри домашней директории используемого maven. Вторые - в рамках заданного нами файла ~/.m2/settings-with-http.xml.

Как обойти блокировку репозитория

Возникающий maven-default-http-blocker представляет собой просто заблокированное зеркало, которое задано для всех внешних HTTP репозиториев.

И вариант обхода прост. В пользовательских настройках необходимо задать зеркало для нужного нам репозитория, которое не будет заблокированным. И в рамках набора эффективных настроек оно будет располагаться “раньше”.

 1<?xml version="1.0" encoding="UTF-8"?>
 2<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
 5
 6    <localRepository>D:/.m2/local_repository</localRepository>
 7    <mirrors>
 8        <mirror>
 9            <id>private-nexus-common-http-unblocker</id>
10            <mirrorOf>private-nexus-common</mirrorOf>
11            <url>http://akorolev.dev:9083/repository/common/</url>
12        </mirror>
13    </mirrors>
14    <profiles>
15        <profile>
16            <activation>
17                <activeByDefault>true</activeByDefault>
18            </activation>
19            <repositories>
20                <repository>
21                    <id>private-nexus-common</id>
22                    <name>Репозиторий релизных артефактов</name>
23                    <url>http://akorolev.dev:9083/repository/common/</url>
24                    <releases>
25                        <enabled>true</enabled>
26                    </releases>
27                    <snapshots>
28                        <enabled>false</enabled>
29                    </snapshots>
30                </repository>
31            </repositories>
32        </profile>
33    </profiles>
34</settings>
 1<?xml version="1.0" encoding="UTF-8"?>
 2<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
 4    <localRepository>D:\.m2\local_repository</localRepository>
 5    <mirrors>
 6        <mirror>
 7            <mirrorOf>private-nexus-common</mirrorOf>
 8            <url>http://akorolev.dev:9083/repository/common/</url>
 9            <id>private-nexus-common-http-unblocker</id>
10        </mirror>
11        <mirror>
12            <mirrorOf>external:http:*</mirrorOf>
13            <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
14            <url>http://0.0.0.0/</url>
15            <blocked>true</blocked>
16            <id>maven-default-http-blocker</id>
17        </mirror>
18    </mirrors>
19    <profiles>
20        <profile>
21            <repositories>
22                <repository>
23                    <id>private-nexus-common</id>
24                    <name>Репозиторий релизных артефактов</name>
25                    <url>http://akorolev.dev:9083/repository/common/</url>
26                    <releases/>
27                    <snapshots>
28                        <enabled>false</enabled>
29                    </snapshots>
30                </repository>
31            </repositories>
32            <activation>
33                <activeByDefault>true</activeByDefault>
34            </activation>
35        </profile>
36    </profiles>
37    <pluginGroups>
38        <pluginGroup>org.apache.maven.plugins</pluginGroup>
39        <pluginGroup>org.codehaus.mojo</pluginGroup>
40    </pluginGroups>
41</settings>
 1$ mvn clean package -s ~/.m2/settings-with-http.xml
 2Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
 3[INFO] Scanning for projects...
 4[INFO]
 5[INFO] -------------------< dev.akorolev.maven:simple-pom >--------------------
 6[INFO] Building simple-pom 0.1.0
 7[INFO]   from pom.xml
 8[INFO] --------------------------------[ jar ]---------------------------------
 9Downloading from private-nexus-common-http-unblocker: http://akorolev.dev:9083/repository/common/dev/akorolev/front/app/6.2.0/app-6.2.0.pom
10Downloaded from private-nexus-common-http-unblocker: http://akorolev.dev:9083/repository/common/dev/akorolev/front/app/6.2.0/app-6.2.0.pom (9.5 kB at 39 kB/s)
11Downloading from private-nexus-common-http-unblocker: http://akorolev.dev:9083/repository/common/dev/akorolev/front/app/6.2.0/app-6.2.0.jar
12Downloaded from private-nexus-common-http-unblocker: http://akorolev.dev:9083/repository/common/dev/akorolev/front/app/6.2.0/app-6.2.0.jar (78 kB at 154 kB/s)
13...