👋

Minecraft Forge 1.7.10環境でのModのビルド等ができなくなった問題

2020/11/02に公開

この記事はQrunchのサービス終了に伴う移行のための投稿です。

要約

Maven Centralの完全Https化により、Gradle 2.0のデフォルト設定だとMaven Centralにアクセスできなくなりました。
1.7.10用のForgeのGradle向けPlugin(Forge Gradle)のバージョン1.2.xが対応する中で最も新しいバージョンである4.4.1を使いましょう(Gradleの最新版は6.1.1)
build.gradleの存在するディレクトリでコンソール(Windowsならcmd.exeもしくはPowerShell, mac, linuxならそれぞれのシェル)でgradlew wrapper --gradle-version=4.4.1を実行する事でGradleのバージョンをあげれます。

詳細

経緯

2020/1/17にMinecraft Forgeのフォーラムに「1.7.10で依存解決ができない」という投稿がされました。
Twitterでも同様の症状が報告されていた模様。
ちなみに私は今日Minecraft Modding DBというDiscord鯖にこの話が流れてきて知りました。

原因

エラーログからの調査

Forgeのフォーラムにおける投稿の中のエラーログを引用します。

* What went wrong:
A problem occurred configuring root project 'Batman Mod'.
> Could not resolve all dependencies for configuration ':classpath'.
   > Could not resolve org.eclipse.equinox:common:[3.2.0,4.0.0).
     Required by:
         :Batman Mod:unspecified > net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT > net.minecraftforge.srg2source:Srg2Source:3.2-SNAPSHOT > org.eclipse.core:jobs:3.5.300-v20130429-1813
         :Batman Mod:unspecified > net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT > net.minecraftforge.srg2source:Srg2Source:3.2-SNAPSHOT > org.eclipse.core:contenttype:3.4.200-v20130326-1255
         :Batman Mod:unspecified > net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT > net.minecraftforge.srg2source:Srg2Source:3.2-SNAPSHOT > org.eclipse.equinox:preferences:3.5.100-v20130422-1538
      > Failed to list versions for org.eclipse.equinox:common.
         > Unable to load Maven meta-data from http://repo1.maven.org/maven2/org/eclipse/equinox/common/maven-metadata.xml.
            > Could not GET 'http://repo1.maven.org/maven2/org/eclipse/equinox/common/maven-metadata.xml'. Received status code 501 from server: HTTPS Required
(中略)

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 22.641 secs

重要な部分だけ抜粋します

> Could not GET 'http://repo1.maven.org/maven2/org/eclipse/equinox/common/maven-metadata.xml'. Received status code 501 from server: HTTPS Required

こんな長い英語読めない!って人のために最低限の部分を強調します

Could not GET 'http://repo1.maven.org/maven2/org/eclipse/equinox/common/maven-metadata.xml'. Received status code 501 from server: HTTPS Required

そうです、GradleがMaven Centralに対してHttpでリクエストを投げようとしてHttpsが要求されてエラーが出ています

さて、以前はHttpリクエストでも大丈夫だったはずです。この件が騒がれ始めたのは最近。では、いつからこうなったのでしょうか?
Maven Centralを運用しているSonatypeのブログに書いてあります。
The Central Repository is Moving to HTTPS
2019/12/20の投稿で、2020/1/15にHttpのサポートを切ってHttpsへ移行するよ!という旨の事が書いてあります。
MavenリポジトリがHttpかHttpsかなんて気にしたことも無かったのでこの件で調べるまでまったく知りませんでした
ちなみにSonatypeのサポートページにもCentral 501 HTTPS Required というタイトルでこのエラーが出た場合の対処法(Httpsへの移行方法)が書いてあります。
つまり、Maven CentralのHttp非サポート化自体は以前から予告されており、サポートも用意されているという完全に近い状態での移行がされたわけです。英語の情報しか無かっただけで。

Gradleの調査

さて、Twitter等で見ていると人によっては正常に動作する場合があるそうです。原因はなんでしょうね?Gradleのバージョンが変わると大丈夫らしい、という情報もありました。
Minecraft Forge 1.7.10の最新のsrcをダウンロードしてGradleのバージョンを見てみましょう。多くの人はこれをコピペして利用しているはずです。

gardle/wrapper/gradle-wrapper.properties

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

衝撃ですね。 gradle-2.0です。ちなみに現在の最新は6.1.1です。2.0のリリースは2014年7月だそうです。5年以上前。1.7.10、そんな昔の産物だったんですねぇ・・・

さて、多くの人はGradleでMaaven Centralを用いる時、mavenCentral()を用いると思います。ということは、恐らくGradleのmavenCentral()内にhttpでMaven Centralへのリンクがハードコードされているのでしょう。

では、GradleがMaven CentralのURLをhttpsに更新したのはいつなのでしょうか?
調べてみた結果、衝撃の事実が。Gradle 2.0の次のマイナーアップデートであるGradle 2.1でHttpsへの更新が行われていました。リリースノートに明記されています。つまり、何かしらの互換性的な問題がある場合、2.1に上げる事さえできればどうにかなるようですね。
ちなみに、Gradle 4.5で加えられたAPIの変更により、Forge Gradle 1.2はGradle 4.5以降では動作しません。合掌。
有志の人が作ったForge Gradle 1.2のGradle 4.5以降対応版もあるので最新のGradleを利用したい人はこれを使うと良いでしょう。

おまけ: Gradle 2.0について

自分でこの事象(Httpアクセスのリジェクト)を再現していないので実際どうなるかを試してみたいです。百聞は一見に如かず、調べるだけでは実際にどうなるのかわかりません。ついでに、一回実行してみれば定義へのジャンプでGradleの実装も見れて一石二鳥!
ということでやってみました。

あれ?期待していたエラーとは違いますね。かなり短いです。なんて書いてあるのかな?

Support for builds using Gradle versions older than 2.6 was removed in tooling API version 5.0. You are currently using Gradle version 2.0. You should upgrade your Gradle build to use Gradle 2.6 or later.

Possible solution:
 - Upgrade Gradle wrapper to 2.6 version and re-import the project

・・・・・・・
え~、私が使っているのはIntelliJ IDEAという統合開発環境なんですが、これは現在Gradle 5.0のツール用のAPIを用いているようです。そして、Gradle 2.6より古いバージョンのサポートは打ち切られたそうです。流石に草しか生えません。
しかし、このままでは実験ができません。JetBrarins Toolboxを使えば昔のバージョンのIntelliJも2クリックでインストールできます。現在インストール可能なのは2018年の最終版ですね。Gradle 5.0がリリースされたのは2018年の秋なので、流石にこれなら大丈夫でしょう。
設定のインポートが面倒くさいので省略したので見た目が変わってます

これは流石に予想外ですね。思わず調べてしまいました。

Java - Wikipeedia Java SE 8 (2014年3月18日)

Gradle 2.0: 2014年7月, Java 8: 2014年3月18日
あれ?Gradle 2.0のリリースノートにもJava 8のサポートが明記されています。一緒にインストールしているJava 11で何故か起動されているのでしょうか?とりあえずこのPCではこれ以上の調査はできないようなので断念。

結論: Gradle 2.0は各所からサポートを打ち切られている古のツールなので使うべきではない

結論

  • Maven CentralがHttpアクセスを弾く様になったよ
  • Forge 1.7.10のsrcだとGradle 2.0が使われてるよ
  • Gradle 2.0はMaven CentralへのアクセスにHttpを使っているよ
  • Grale 2.1でHttpsに変更されたので最低でもGradle 2.1に上げれば動くよ
  • ただ、Gradle 2.xは古すぎるので1.7.10用のForge Gradleが対応している中で最新版のGradle 4.4.1を使おう
  • 有志の人が作ったForge Gradle 1.2のGradle 4.5以降対応版があるからコレを使ってGradleのバージョンを最新(6.x)に上げるのもいいと思うよ
  • Forge 1.7.10を利用するのは良いけど、Forge 1.7.10の公式のサポートは打ち切られている事を忘れずに。これ以上どんな不具合が起こっても保証はされない。

Discussion