Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

jarファイル実行で「java.lang.ClassNotFoundException: com.sun.prism.es2.X11GLFactory」が出る原因と対策

投稿日:2022年5月2日 更新日:

 

<目次>

(1) jarファイル実行で「java.lang.ClassNotFoundException: com.sun.prism.es2.X11GLFactory」が出る原因と対策
 (1-1) エラーメッセージ・発生状況
 (1-2) 原因
 (1-3) 対策

(1) jarファイル実行で「java.lang.ClassNotFoundException: com.sun.prism.es2.X11GLFactory」が出る原因と対策

(1-1) エラーメッセージ・発生状況

jarファイルを「java -jar XXX.jar」コマンドで実行しようとした際に下記のエラーが出ました。
 
(エラーメッセージ)Linuxの例
GLFactory.static - Platform: Linux - not available: com.sun.prism.es2.X11GLFactory
java.lang.ClassNotFoundException: com.sun.prism.es2.X11GLFactory
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:377)
	at com.sun.prism.es2.GLFactory$FactoryLoader.run(GLFactory.java:110)
	at com.sun.prism.es2.GLFactory$FactoryLoader.run(GLFactory.java:100)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
	at com.sun.prism.es2.GLFactory.(GLFactory.java:97)
	at com.sun.prism.es2.ES2Pipeline.(ES2Pipeline.java:77)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:377)
	at com.sun.prism.GraphicsPipeline.createPipeline(GraphicsPipeline.java:218)
	at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:91)
	at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)
	at java.base/java.lang.Thread.run(Thread.java:832)
java.lang.ClassNotFoundException: com.sun.glass.ui.gtk.GtkPlatformFactory
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:377)
	at com.sun.glass.ui.PlatformFactory.getPlatformFactory(PlatformFactory.java:42)
	at com.sun.glass.ui.Application.run(Application.java:144)
	at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:280)
	at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:269)
	at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
	at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)
	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:678)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
	at java.base/java.lang.Thread.run(Thread.java:832)
Failed to load Glass factory class
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "com.sun.glass.ui.PlatformFactory.createApplication()" because the return value of "com.sun.glass.ui.PlatformFactory.getPlatformFactory()" is null
	at com.sun.glass.ui.Application.run(Application.java:144)
	at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:280)
	at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:269)
	at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
	at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)
	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:678)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
	at java.base/java.lang.Thread.run(Thread.java:832)

(図111①)

(実行の前提条件)
⇒私のJavaのバージョンはJava 15以上で、実行しようとしたjarはJava 11でコンパイルされたものだったので、バージョンは問題なし。
 
・Java FXのライブラリを適当な場所に配備し、環境変数を設定済み

●参考情報

Windowsでも類似のエラー(ClassNotFoundException)が出ました。
 
(エラーメッセージ)

HH:MM:SS INFO Runner - Detected 64 bit Windows
HH:MM:SS INFO Runner - Using winutils.exe as binary
java.lang.ClassNotFoundException: com.sun.glass.ui.win.WinPlatformFactory
(図111②)

(1-2) 原因

jarファイルの実行に必要なモジュールの依存関係が解決できていなかった(実行に必要なモジュールが不足していた)ためです。

目次にもどる

(1-3) 対策

結論としては、コマンドを下記のように修正する事で実行できました。「–module-path」でjarファイルの実行に必要なモジュールの格納先を指定し、不足しているモジュールを「–add modules」オプションで追加しています。
 
(修正前)
java -jar XXXXX.jar
(修正後)
java --module-path "[ご自身のJava FXライブラリ格納パス]" --add-modules javafx.controls,javafx.fxml -jar XXXXX.jar
(図131①)jarの起動成功
 

●補足

・「–module-path」
「–module-path」は必要な全てのコンパイルされたモジュール(jarファイル等)があるパスを指定します。私の例では「C:\Program Files\Java\jdk-17.0.1\jfx\lib」に格納していたので、そこを指定しています。
(図132①)

・「–add-modules」
「–add-modules」はjavaやjavacで使えるオプションで、実行に必要なモジュール(ライブラリ等)が含まれるように、それらを明示的に指定するためのオプションです。必要なモジュールをカンマで区切って指定します(例:–add-modules javafx.controls,javafx.fxml)。
 
また、この「–add-modules」は依存性も自動で解決してくれます。例えば「javafx.graphics」は「javafx.controls」に含まれるため、明示的に指定する必要はありません。
 
・「javafx.controls」
Java FXのUIツールキットで利用できるチャート部品やUI制御を提供します。
 
・「javafx.fxml」
XML形式の一つで、Java FXのGUI部品をHTMLに似た方法でページとして1つに纏めることができます。そのため、FXMLはJava FXのレイアウトを残りのアプリケーション部分と分断する事ができます。
 
(例)FXMLのサンプル
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>

<VBox>
    <children>
        <Label text=" FXML Hello world Sample"/>
    </children>
</VBox>

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Javaのprintfで日付の書式設定を行う方法

<目次> (1) Javaのprintfで日付の書式設定を行う方法  (1-1) printfの基本構文  (1-2) 時刻に関するフォーマット  (1-3) 日付に関するフォーマット (1) Jav …

エラー「Project ‘XXXX’ is missing required library: ‘XXXX.jar’」の原因と対処法

<目次> (1) エラー「Project ‘XXXX’ is missing required library: ‘XXXX.jar’」の原因と対処法 …

Javaで複数の配列を結合する方法について

<目次> (1) Javaで複数の配列を結合する方法について  (1-1) 構文  (1-2) サンプルプログラム (1) Javaで複数の配列を結合する方法について Javaで複数の配列を結合する方 …

Javaのアーキテクチャ概要やプログラムのコンパイルから実行までの流れ

(0)目次&概説 (1) 記事の目的  (1-1) 目的 (2) Javaのアーキテクチャ概要・概観  (2-1) プログラムのコンパイル~実行の流れ  (2-2) Javaアーキテクチャの特徴    …

Tomcatのコネクションプールの設定手順

<目次> (1) Tomcatのコネクションプールの設定手順  (1-1) コネクションプールとは?  (1-2) コネクションプールの設定手順   (1-2-1) context.xmlの記述    …

  • English (United States)
  • 日本語
Top