Открытие файла .jar на Mac с использованием JDK 11 завершается неудачно с RuntimeException - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь открыть файл .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)

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

1 Ответ

0 голосов
/ 17 ноября 2018

Если вы скачали банку из первого теста выпуска , при запуске его как:

java -jar SQLChecker-1.0.jar

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

КакПервое простое исправление: если вы загрузили JavaFX 11 SDK , запустите его вместо этого:

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

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

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

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

Но есть двабольше новых выпусков SQLChecker.

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

java -jar SQLChecker-1.0.3.jar

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

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

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

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

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

...