はじめに
数か月前、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に聞いて何とかしましょう。時間を無駄にするなよ!