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のスレッドとは?概念やサンプルプログラムのご紹介

  <目次> (1) Javaのスレッドとは?概念やサンプルプログラムのご紹介  (1-1) Javaのスレッドとは?  (1-2) 方法①:Threadクラス継承の構文  (1-3) 方法 …

Twitter APIのRate Limit Exceedエラー(code – 88)を回避するための簡易的な対策について

<目次> (1) Twitter APIのRate Limit Exceedエラー(code – 88)を回避するための簡易的な対策について  (1-1) 対策①:APIの使用回数に閾値を設ける  ( …

JavaのDequeの概要や使い方+サンプルプログラムもご紹介

<目次> (1) JavaのDequeの概要や使い方+サンプルプログラムもご紹介  (1-1) Dequeとは?  (1-2) Dequeを実装したクラス  (1-3) Dequeの使い方  (1-4 …

Linuxサーバ(CentOS6)にEclipse(OXYGEN)をインストールする

0.目次 (1) JDKの概要  (1-1) JDKの種類  (1-2) JDKのバージョン(2018年2月時点) (2) JDKのインストール  (2-1) wget コマンドでJDK の rpm …

Javaで正規表現の使い方をご紹介+サンプルプログラム付き

<目次> (1) Javaで正規表現の使い方をご紹介  (1-1) 正規表現とは?  (1-2) Javaでの正規表現の使い方  (1-3) サンプルプログラム (1) Javaで正規表現の使い方をご …

  • English (United States)
  • 日本語
Top