Не удается запустить приложение JavaFx из Intellij на OSx (Mac) - PullRequest
1 голос
/ 22 сентября 2019

У меня есть проект JavaFx (maven) и следующая конфигурация запуска в Intellij:

(mvn) clean javafx:run

Эта конфигурация прекрасно работает в Windows, но в OSx приводит к следующей ошибке:

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 javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:280)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:243)
    at javafx.graphics/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:260)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:409)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:94)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)
    at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: No toolkit found
    at javafx.graphics/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:272)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:409)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    ... 5 more

Я погуглил эту ошибку, и она, кажется, связана с отсутствующими библиотеками JavaFx.

Однако, если я выполню следующую конфигурацию запуска:

(mvn) clean package

Затем он создаст правильный JAR, который язатем можно выполнить на моем Mac.

Итак, я подозреваю, что это может быть некоторой проблемой, связанной с плагином javafx intellij, но я не уверен в этом и как обойти эту проблему (если это действительнопроблема).

Мой pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <dependencies>

        <dependency>
            <groupId>com.google.code.findbugs</groupId>
            <artifactId>jsr305</artifactId>
            <version>3.0.2</version>
        </dependency>

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

        <dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>4.6</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>12.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>12.0.2</version>
        </dependency>

        <!-- the reason for having these dependency for all classifiers is here: https://stackoverflow.com/a/52654791/2463035-->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics </artifactId>
            <version>12.0.2</version>
            <classifier>win</classifier>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics </artifactId>
            <version>12.0.2</version>
            <classifier>linux</classifier>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics </artifactId>
            <version>12.0.2</version>
            <classifier>mac</classifier>
        </dependency>

    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.fxml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.3</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>com.app.MyApplication</mainClass>
                        </configuration>
                    </execution>
                    <execution>
                        <!-- Configuration for debugging -->
                        <id>debug</id>
                        <configuration>
                            <options>
                                <option>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005</option>
                            </options>
                            <mainClass>com.app.MyApplication</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals><goal>shade</goal></goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">

                                    <mainClass>com.app.MainClass</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

</project>

Последняя запись в журнале после выполнения mvn clean -X javafx:run:

Executing command line: [C:\Program Files\JetBrains\IntelliJ IDEA 2019.2\jbr\bin\java.exe, --module-path, C:\Users\Vasiliy\.m2\repository\org\openjfx\javafx-base\12.0.2\javafx-base-12.0.2-win.jar
C:\Users\Vasiliy\.m2\repository\org\openjfx\javafx-base\12.0.2\javafx-base-12.0.2.jar
C:\Users\Vasiliy\.m2\repository\org\openjfx\javafx-controls\12.0.2\javafx-controls-12.0.2-win.jar
C:\Users\Vasiliy\.m2\repository\org\openjfx\javafx-controls\12.0.2\javafx-controls-12.0.2.jar
C:\Users\Vasiliy\.m2\repository\org\openjfx\javafx-fxml\12.0.2\javafx-fxml-12.0.2-win.jar
C:\Users\Vasiliy\.m2\repository\org\openjfx\javafx-fxml\12.0.2\javafx-fxml-12.0.2.jar
C:\Users\Vasiliy\.m2\repository\org\openjfx\javafx-graphics\12.0.2\javafx-graphics-12.0.2-linux.jar
C:\Users\Vasiliy\.m2\repository\org\openjfx\javafx-graphics\12.0.2\javafx-graphics-12.0.2-mac.jar
C:\Users\Vasiliy\.m2\repository\org\openjfx\javafx-graphics\12.0.2\javafx-graphics-12.0.2-win.jar
C:\Users\Vasiliy\.m2\repository\org\openjfx\javafx-graphics\12.0.2\javafx-graphics-12.0.2.jar, --add-modules, javafx.base,javafx.controls,javafx.fxml,javafx.graphics,javafx.graphics,javafx.graphics, -classpath, C:\Users\Vasiliy\projects\wellsense-annotator\target\classes
C:\Users\Vasiliy\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar
C:\Users\Vasiliy\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar
C:\Users\Vasiliy\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar
C:\Users\Vasiliy\.m2\repository\com\google\code\gson\gson\2.8.5\gson-2.8.5.jar
C:\Users\Vasiliy\.m2\repository\com\opencsv\opencsv\4.6\opencsv-4.6.jar
C:\Users\Vasiliy\.m2\repository\commons-beanutils\commons-beanutils\1.9.3\commons-beanutils-1.9.3.jar
C:\Users\Vasiliy\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar
C:\Users\Vasiliy\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar
C:\Users\Vasiliy\.m2\repository\org\apache\commons\commons-collections4\4.2\commons-collections4-4.2.jar
C:\Users\Vasiliy\.m2\repository\org\apache\commons\commons-lang3\3.8.1\commons-lang3-3.8.1.jar
C:\Users\Vasiliy\.m2\repository\org\apache\commons\commons-text\1.3\commons-text-1.3.jar
C:\Users\Vasiliy\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar, com.wellsensevu.MyApplication]

Любая помощь будет в значительной степениоценили.

1 Ответ

1 голос
/ 22 сентября 2019

Когда вы добавляете три классификатора для javafx-graphics, это решает проблему создания толстой кроссплатформенной фляги.

Однако, запуск вашего pom на Mac из терминала (это не IntelliJпроблема), происходит сбой, с опубликованной ошибкой (No toolkit found).

Если вы запустите: mvn clean -X javafx:run, вы найдете причину этого исключения:

[DEBUG] Executing command line: [.../Contents/Home/bin/java, \
--module-path, .../target/classes:\
.../.m2/repository/org/openjfx/javafx-base/13/javafx-base-13-mac.jar:\
.../.m2/repository/org/openjfx/javafx-controls/13/javafx-controls-13-mac.jar:\
.../.m2/repository/org/openjfx/javafx-fxml/13/javafx-fxml-13-mac.jar:\
.../.m2/repository/org/openjfx/javafx-graphics/13/javafx-graphics-13-linux.jar:\
.../.m2/repository/org/openjfx/javafx-graphics/13/javafx-graphics-13-mac.jar:\
.../.m2/repository/org/openjfx/javafx-graphics/13/javafx-graphics-13-win.jar,\
--add-modules,...]

Обратите внимание, чтоВо-первых, он показывает классификатор linux, потому что артефакты отсортированы буквенно-цифровым образом, и три файла фактически ссылаются на один и тот же модуль javafx-graphics.

Поскольку --module-path разрешит только первое вхождение данного модуля (см. JEP 261 или этот ответ ), игнорируя остальные, mvn clean javafx:run будет работать только в Linux.

В заключение, с вашей текущей помпой, толстый кроссплатформенный jar будет работать на Linux, Mac и Windows, а javafx:run будет работать только на Linux.

Solution

Чтобы избежать необходимости комментировать графическую зависимость при помощи классификаторов каждый раз, когда вы хотите запустить javafx:run, при этом оставляя их для построения плагина затенения, решение, основанное на этот ответ , это следующее:

  • Удалите три зависимости javafx-graphic из вашего пом
  • Добавьте следующий профиль в ваш пом, включая эти три зависимости:
<profiles>
        <profile>
            <id>shadeProfile</id>
            <dependencies>
                <dependency>
                    <groupId>org.openjfx</groupId>
                    <artifactId>javafx-graphics</artifactId>
                    <version>13</version>
                    <classifier>win</classifier>
                </dependency>
                <dependency>
                    <groupId>org.openjfx</groupId>
                    <artifactId>javafx-graphics</artifactId>
                    <version>13</version>
                    <classifier>mac</classifier>
                </dependency>
                <dependency>
                    <groupId>org.openjfx</groupId>
                    <artifactId>javafx-graphics</artifactId>
                    <version>13</version>
                    <classifier>linux</classifier>
                </dependency>
            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-shade-plugin</artifactId>
                        <version>3.2.1</version>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>shade</goal>
                                </goals>
                                <configuration>
                                    <transformers>
                                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                            <mainClass>com.app.MainClass</mainClass>
                                        </transformer>
                                    </transformers>
                                    <shadedClassifierName>shaded</shadedClassifierName>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

Чтобы запустить этот профиль, вам нужно будет выполнить:

mvn -PshadeProfile package

Это будет включать все существующие зависимости в вашем pom, и дополнительно будет включать дополнительные три банки.

Теперь оба mvn clean javafx:run и java -jar yourShade.jar шможет работать на Linux, Mac и Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...