はじめに
数か月前、Eclipseで開発していたJavaFXのGradleプロジェクトがあったのですが、環境が壊れやすく、AI補完ツールなども使えないので色々開発に支障が出ると感じたため、VS Codeに移行しようと試みました。
試行錯誤の末に解決できたので、同じような状況で困っている方の参考になればと思い、備忘録としてまとめます。
環境
- OS: Windows
- IDE: VS Code
- 元のIDE: Eclipse (Pleiades)
- Gradle: 8.x
- Java: JDK 21
- JavaFX: 21.x
発生した問題と解決までの道のり
主に以下の問題に直面し、一つずつ解決していきました。
1. JavaFXのクラスが見つからない (cannot be resolved)
問題: VS Codeでプロジェクトを開くと、import javafx... の行すべてと、Application、Stage などのJavaFX関連クラスが「cannot be resolved」と表示され、ビルドも実行もできない。
原因:
build.gradle にJavaFXの依存関係が適切に定義されていないか、VS CodeがGradleプロジェクトとして正しく認識できていなかった。特に、Eclipseでプロジェクトを管理していた名残が原因でした。
解決策:
-
build.gradleの整理:-
pluginsブロックからid 'eclipse'プラグインを削除しました。 -
dependenciesブロックからorg.openjfx:javafx-...:winのようなJavaFXの明示的なimplementation行を削除しました(org.openjfx.javafxpluginが自動で処理するため冗長)。 -
repositoriesからjcenter.bintray.comを削除しました(非推奨のため)。
-
-
VS CodeとGradleの同期:
-
build.gradleを保存し、VS Codeのポップアップで「Yes」または「Always」を選択してクラスパスを更新。 - VS Codeのターミナルで
gradlew.bat clean build --refresh-dependenciesを実行し、Gradleのキャッシュをクリアして再ビルド。 - VS Codeを完全に再起動。
-
2. アプリケーションがモジュールとして見つからない (Module ... not found)
問題: gradlew run を実行すると、「Error occurred during initialization of boot layer」や「java.lang.module.FindException: Module SampleProjectApp not found」というエラーが出て実行できない。
原因:
プロジェクトに module-info.java ファイルが存在しないにもかかわらず、build.gradle にJavaモジュールシステム(JPMS)に関する設定が残っていたため。(Eclipseではこれで動いていたのですが、まあエラーが出るなら消すしかねえか。)
解決策:
-
build.gradleから、以下のモジュールシステム関連の記述をすべて削除しました。java { modularity.inferModulePath = true }application { mainModule = 'SampleProjectApp' }tasks.withType(JavaExec).configureEach { jvmArgs = [...] }
- 再度
gradlew.bat clean build --refresh-dependenciesを実行し、VS Codeを再起動。
3. プラグインが見つからない (Plugin ... not found)
問題: gradlew コマンド自体が、「Plugin [id: 'org.gradle.toolchains.foojay-resolver-convention', version: '0.8.0'] was not found」というエラーで失敗する。
原因:
settings.gradle.kts ファイルに記述されていたFoojay Resolverプラグインが、何らかの理由でGradleから取得できなかったため。
解決策:
-
settings.gradle.ktsファイルを開き、pluginsブロック内のid("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0"の行をコメントアウトまたは削除しました。 - 再度
gradlew.bat clean build --refresh-dependenciesを実行し、VS Codeを再起動。
4. メインクラスが見つからない (ClassNotFoundException: app.MainJava)
問題: gradlew run を実行すると、「エラー: メイン・クラスapp.MainJavaをロードできませんでした」や「java.lang.ClassNotFoundException: app.MainJava」というエラーが出て実行できない。
原因:
build.gradle の application { mainClass = '...' } の設定が、実際のメインクラス名 (app.Main) と一致していなかった。また、EclipseでのFMXLロード問題への対策として記述していたカスタムのリソースコピー設定が、Gradleの標準的なクラスパス構築を妨げていた可能性。
解決策:
-
mainClassの修正:-
build.gradleのapplication { mainClass = 'app.Main' }と、実際のメインクラス (src/main/java/app/Main.javaのpublic class Main extends Application) が完全に一致するように修正しました。
-
-
カスタムリソースコピーの削除:
-
build.gradle内のtasks.processResources以降の、カスタムでリソースをbuild/classes/java/mainにコピーするようなタスク(copyResourcesToBinなど)とその依存関係をすべて削除しました。Gradleの標準的なリソース配置(build/resources/main)に任せる形にしました。
-
- 再度
gradlew.bat clean build --refresh-dependenciesを実行し、VS Codeを再起動。
まとめ
環境構築は本当に大変。だが、Eclipse時代のエラー吐いているのにアプリは動く、みたいな怖い現象が起こらなくなったのでハッピーです。
-
build.gradleはシンプルに、Gradleの標準的な挙動に任せる。 -
module-info.javaがないなら、モジュールシステム関連の設定は削除する。 - ファイル名とクラス名、
mainClassの設定は正確に一致させる。 - 何か変更したら、
gradlew clean build --refresh-dependenciesとVS Codeの再起動をセットで行う。
同じような課題に直面している方、こんな記事は読まずにAIに聞いて何とかしましょう。時間を無駄にするなよ!