modulea.jar
とmoduleb.jar
の2つのファイルに2つのJPMSモジュールがあります。 Moduleaにはjavafx.controls
モジュールが必要です。これらのモジュールを新しいレイヤーで使用する必要があるので、次のようにします。
ModuleFinder Finder = ModuleFinder.of(modAPath, modBPath);
ModuleLayer parent = ModuleLayer.boot();
Configuration cf = parent.configuration().resolveAndBind(Finder, ModuleFinder.of(), new HashSet<>());
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer newLayer = parent.defineModulesWithOneLoader(cf, scl);
JDKモジュールは自動的にロードされると思いましたが、
Exception in thread "main" Java.lang.module.FindException: Module javafx.controls not found, required by modulea
at Java.base/Java.lang.module.Resolver.findFail(Resolver.Java:889)
at Java.base/Java.lang.module.Resolver.resolve(Resolver.Java:191)
at Java.base/Java.lang.module.Resolver.bind(Resolver.Java:297)
at Java.base/Java.lang.module.Configuration.resolveAndBind(Configuration.Java:428)
at Java.base/Java.lang.module.Configuration.resolveAndBind(Configuration.Java:230)
同時に:Java --list-modules
を実行すると、出力は次のようになります。
...
javafx.base@9
javafx.controls@9
javafx.deploy@9
javafx.fxml@9
javafx.graphics@9
javafx.media@9
javafx.swing@9
javafx.web@9
それを修正する方法は?
@AlanBatemanのコメントから:
javafx.controls
モジュールはデフォルトではロードされません。 --add-modules javafx.controls
を指定して実行すると、強制的にブートレイヤーに入れることができます。
注:Java 11で始まるJavaFXは、別のプロジェクトです。