Skip to content

Maven DependencyResolutionException の解決方法

問題の概要

Maven 3.8.1 以降で mvn clean package を実行した際に、以下のような DependencyResolutionException が発生する場合があります:

log
[ERROR] Failed to execute goal on project ...: Could not resolve dependencies
...
[ERROR] Blocked mirror for repositories: [EBI (http://www.ebi.ac.uk/...), releases (http://gose.fiehnlab.ucdavis.edu:55000/...)]

このエラーは、Maven 3.8.1 から導入されたセキュリティ強化機能によるもので、安全でない HTTP リポジトリへの接続がデフォルトでブロックされるようになったことが原因です。

原因の詳細

Maven 3.8.1 では、以下のようなミラー設定が既定で含まれるようになりました:

xml
<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>

この設定により、すべての外部 HTTP リポジトリへのアクセスがブロックされ、セキュリティが強化されています。ただし、古いプロジェクトや HTTPS に対応していないリポジトリを使用している場合は、この設定がビルド失敗の原因となります。

解決方法

方法1: HTTPS リポジトリへの移行(推奨)

最も安全で推奨される解決方法は、HTTP リポジトリを HTTPS に移行することです。

pom.xml の修正例:

xml
<repositories>
  <repository>
    <id>wso2-nexus</id>
    <!-- HTTP → HTTPS に変更 -->
    <url>https://maven.wso2.org/nexus/content/groups/wso2-public/</url>
  </repository>
</repositories>

TIP

リポジトリが HTTPS をサポートしているかどうか確認し、可能な限りこの方法を採用してください。

方法2: ミラー設定の変更

プロジェクト固有の設定として、.mvn/ ディレクトリにカスタム設定を作成します。

手順:

  1. プロジェクトルートに .mvn ディレクトリを作成
  2. .mvn/custom-settings.xml ファイルを作成:
xml
<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>insecure-repo-mirror</id>
      <mirrorOf>external:http:*</mirrorOf>
      <url>http://www.ebi.ac.uk/intact/maven/nexus/content/repositories/ebi-repo/</url>
      <blocked>false</blocked>
    </mirror>
  </mirrors>
</settings>
  1. .mvn/maven.config ファイルを作成:
--settings .mvn/custom-settings.xml

方法3: グローバル設定の変更

開発環境でのみ使用する場合、グローバルな設定を変更することも可能です。

${MAVEN_HOME}/conf/settings.xml の編集:

xml
<mirrors>
  <!-- 以下のミラー設定をコメントアウトまたは削除 -->
  <!--
  <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>
  -->
</mirrors>

注意

グローバル設定の変更はセキュリティリスクを伴うため、慎重に行ってください。

方法4: Maven のダウングレード

一時的な解決策として、Maven 3.6.3 などの古いバージョンを使用する方法もあります。

bash
# macOS (Homebrew) の場合
brew uninstall maven
brew install maven@3.6

非推奨

この方法はセキュリティ上のリスクがあるため、一時的な対策としてのみ使用し、できるだけ早く他の解決方法に移行してください。

ベストプラクティス

  1. リポジトリのHTTPS化を優先: 可能な限りHTTPS対応のリポジトリを使用する
  2. プロジェクト設定の共有: チーム開発では .mvn/ ディレクトリを使用して設定を共有する
  3. セキュリティと互換性のバランス: 本番環境ではセキュリティを優先し、開発環境でのみHTTPリポジトリを許可する

まとめ

Maven 3.8.1 以降での DependencyResolutionException は、セキュリティ強化によるHTTPリポジトリのブロックが原因です。最善の解決策はHTTPSリポジトリへの移行ですが、プロジェクト設定やグローバル設定の変更によっても問題を解決できます。セキュリティリスクを理解した上で、プロジェクトの要件に合った適切な解決方法を選択してください。