Как обойти блокировку репозитория, который настроен только для работы по HTTP протоколу.
Все примеры запускались на Maven 3.9.6
Используя 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 использует наследование не только в рамках построения эффективного 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...
Источник изображения в заголовке Unsplash. Автор Jen Theodore .