Открытие файла .jar на Mac с использованием JDK 11 не удается с RuntimeException

Я пытаюсь открыть файл .jar (https://github.com/ptrckbnck/SQLChecker/releases) на моем MAC Mojave 10.14, он мне нужен для моего университетского курса.

Что я сделал:

java -version

openjdk version "11.0.1" 2018-10-16  
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)  
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)  

Но когда я запускаю java -jar SQLChecker-1.0.jar, я продолжаю получать следующее исключение:

Graphics Device initialization failed for :  es2, sw
Error initializing QuantumRenderer: no suitable pipeline found
java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:280)
at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:222)
at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:260)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)
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:834)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:94)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)
... 1 more
Exception in thread "main" java.lang.RuntimeException: No toolkit found
at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:272)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)
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:834)

Я прочитал связанный поток Переход на JDK 11 + JavaFX 11 с исключением RuntimeException и загрузил также JavaFX 11, а именно JavaFX Mac OS X SDK отсюда https://gluonhq.com/products/javafx/. Я также запускаю следующий код:

export PATH_TO_FX=my/path/to/javafx-sdk-11/lib

и запустите тест HelloWorld с использованием JavaFX 11, как описано здесь https://openjfx.io/openjfx-docs/. Все работало нормально, но мою первоначальную проблему не решило. Как было предложено @Drimux в соответствующем потоке, некоторые библиотеки отсутствуют в дистрибутиве OpenJDK. Ему грустно, что это, вероятно, libprism_es2.dylib, libprism_sw.dylib, libglass.dylib, libjavafx_font.dylib. Поэтому я скопировал эти файлы из javafx-sdk-11.0.1 / lib в /Library/Java/JavaVirtualMachine/jdk-11.0.1.jdk/Contents/Home/lib и снова попытался запустить мой файл .jar. Получено новое исключение:

GLFactory.static - Platform: Mac OS X - not available: com.sun.prism.es2.MacGLFactory
java.lang.ClassNotFoundException: com.sun.prism.es2.MacGLFactory
at   java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:315)
at com.sun.prism.es2.GLFactory$FactoryLoader.run(GLFactory.java:108)
at com.sun.prism.es2.GLFactory$FactoryLoader.run(GLFactory.java:100)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at com.sun.prism.es2.GLFactory.<clinit>(GLFactory.java:97)
at com.sun.prism.es2.ES2Pipeline.<clinit>(ES2Pipeline.java:76)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:315)
at com.sun.prism.GraphicsPipeline.createPipeline(GraphicsPipeline.java:187)
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:834)
java.lang.ClassNotFoundException: com.sun.glass.ui.mac.MacPlatformFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:315)
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:258)
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:834)
Failed to load Glass factory class
Exception in thread "main" java.lang.NullPointerException
at com.sun.glass.ui.Application.run(Application.java:144)
at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:258)
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:834)

Это не устранило проблему. Если вам нужна дополнительная информация, пожалуйста, запросите. Что еще мне попробовать?


person ElMing    schedule 16.11.2018    source источник


Ответы (1)


Если вы загрузили jar из первого тестового выпуска, при запуске вроде:

java -jar SQLChecker-1.0.jar

вы получите опубликованное исключение.

В качестве первого простого исправления, если вы загрузили SDK JavaFX 11, вместо этого запустите следующее:

java --module-path /path-to/javafx-sdk-11/lib --add-modules javafx.controls,javafx.fxml -jar SQLChecker-1.0.jar

Вы можете прочитать о том, зачем нужны эти аргументы виртуальной машины, здесь.

В любом случае вам не следует копировать собственные файлы из JavaFX SDK в JDK.

Новые выпуски

Но есть еще два новых релиза SQLChecker.

Если вы попробуете последний один:

java -jar SQLChecker-1.0.3.jar

это будет работать нормально, без дополнительных аргументов.

Так что же изменилось?

Они распространяют толстый Jar с плагином Maven shade, и для работы с JavaFX 11 на любой платформе вам необходимо включить не только jar-файлы, но и собственные библиотеки.

Как видите, в этом совершении, добавив тег classifier для javafx.graphics, они добавлены необходимые собственные библиотеки для Windows, Linux и Mac, как было также указано в этом вопрос.

Если вы хотите узнать больше о том, как создать толстую банку, см. Этот документ < / а>.

person José Pereda    schedule 17.11.2018