やろうとしていたこと
JavaとVert.xを使用してWebアプリケーションを開発し、そのアプリケーションをHerokuにデプロイしようとしていました。
発生したエラー
デプロイを試みたところ、Herokuのログに2つのエラーが表示されました。
- UnsupportedClassVersionError: your-project-directly/ has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0
- Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 90 seconds of launch
エラーの発生理由
- UnsupportedClassVersionErrorは、開発環境で使用しているJavaのバージョンがHeroku上のJavaランタイムのバージョンよりも新しいために発生したようです。具体的には、開発環境でJava 17を使用してコンパイルされたクラスファイルを、Heroku上のJava 8環境で実行しようとしたため、このエラーが発生しました。
- Error R10は、Herokuがアプリケーションに対して提供している$PORT環境変数のポートに、アプリケーションが90秒以内にバインドできなかったことを示すエラーです。Herokuでは、この時間制限内にアプリケーションが起動しなければならないという制約があります。
解決方法
- UnsupportedClassVersionErrorの解決方法:
HerokuのJavaランタイム環境を、アプリケーションが要求するJavaバージョンに合わせることで解決しました。Herokuのシステムプロパティ設定ファイルを通じてJavaのバージョンを指定することで実現できます。具体的やり方は、system.properties
ファイルをプロジェクトのルートディレクトリに作成し、その中にjava.runtime.version=17
のような形式でバージョンを指定します。記述する内容はコレだけです! - Error R10の解決方法:
アプリケーションが、Herokuが指定するポートにバインドするように修正する必要があります。今回の私のようにJavaとVert.xを使用している場合は、System.getenv("PORT")
を使用してポート番号を取得し、そのポートにアプリケーションをバインドすることができます。また、アプリケーションの起動時間が長すぎる場合は、Herokuのダイノを使用する方法もあるようです。
参考記事
- Heroku Dev Center - Java Support
- Heroku Dev Center - Error R10 (Boot timeout)