无法生成跨平台javaFX应用程序

mui*_*lpp 7 java maven javafx-11

我似乎无法从 javaFX 应用程序生成跨平台构建。

\n

当我从 IntelliJ 运行它时,它工作正常,如果通过 maven 打包它,我还可以在 Linux 上运行生成的 jar。

\n

当我尝试在 Mac 上运行 jar 时出现问题,似乎不包含 JavaFX 库,然后我得到以下堆栈跟踪:

\n
Graphics Device initialization failed for : es2, sw\nError initializing QuantumRenderer: no suitable pipeline found\njava.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found\n    at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:280)\n    at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:244)\n    at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:261)\n    at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)\n    at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)\n    at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)\n    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:678)\n    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)\n    at java.base/java.lang.Thread.run(Thread.java:832)\nCaused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found\n    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:94)\n    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)\n    ... 1 more\nException in thread \xe2\x80\x9cmain\xe2\x80\x9d java.lang.RuntimeException: No toolkit found\n    at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:273)\n    at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)\n    at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)\n    at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)\n    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:678)\n    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)\n    at java.base/java.lang.Thread.run(Thread.java:832)\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用 Java 15 编译为 11 和 JavaFX11。

\n

我还使用 Maven 配置文件每次生成特定版本,并使用 Shade 插件将所有依赖项打包到一个 Fat jar 中。

\n

在实际 FX 应用程序之前还有一个启动器,这是清单所指向的位置。\n这就是 pom 的样子。

\n
<profiles>\n    <profile>\n        <id>linux</id>\n        <dependencies>\n            <dependency>\n                <groupId>org.openjfx</groupId>\n                <artifactId>javafx-controls</artifactId>\n                <version>11</version>\n                <classifier>linux</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.openjfx</groupId>\n                <artifactId>javafx-fxml</artifactId>\n                <version>11</version>\n                <classifier>linux</classifier>\n            </dependency>\n        </dependencies>\n    </profile>\n    <profile>\n        <id>mac</id>\n        <dependencies>\n            <dependency>\n                <groupId>org.openjfx</groupId>\n                <artifactId>javafx-controls</artifactId>\n                <version>11</version>\n                <classifier>mac</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.openjfx</groupId>\n                <artifactId>javafx-fxml</artifactId>\n                <version>11</version>\n                <classifier>mac</classifier>\n            </dependency>\n        </dependencies>\n    </profile>\n    <profile>\n        <id>win</id>\n        <dependencies>\n            <dependency>\n                <groupId>org.openjfx</groupId>\n                <artifactId>javafx-controls</artifactId>\n                <version>11</version>\n                <classifier>win</classifier>\n            </dependency>\n            <dependency>\n                <groupId>org.openjfx</groupId>\n                <artifactId>javafx-fxml</artifactId>\n                <version>11</version>\n                <classifier>win</classifier>\n            </dependency>\n        </dependencies>\n    </profile>\n</profiles>\n\n<build>\n    <plugins>\n        <plugin>\n            <groupId>org.apache.maven.plugins</groupId>\n            <artifactId>maven-compiler-plugin</artifactId>\n            <version>3.8.0</version>\n            <configuration>\n                <release>11</release>\n            </configuration>\n        </plugin>\n        <plugin>\n            <groupId>org.apache.maven.plugins</groupId>\n            <artifactId>maven-shade-plugin</artifactId>\n            <version>3.0.0</version>\n            <executions>\n                <execution>\n                    <phase>package</phase>\n                    <goals>\n                        <goal>shade</goal>\n                    </goals>\n                    <configuration>\n                        <transformers>\n                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">\n                                <manifestEntries>\n                                    <Main-Class>org.log.Launcher</Main-Class>\n                                </manifestEntries>\n                            </transformer>\n                        </transformers>\n                    </configuration>\n                </execution>\n            </executions>\n        </plugin>\n    </plugins>\n</build>\n
Run Code Online (Sandbox Code Playgroud)\n

我还注意到,无论我选择什么配置文件,它总是生成linux版本,并且我可以看到这个maven日志:

\n
[WARNING] javafx-controls-11-win.jar, javafx-graphics-11-linux.jar, javafx-fxml-11-linux.jar, LogAnalyzer-1.0-SNAPSHOT.jar, javafx-base-11-linux.jar, javafx-controls-11-linux.jar, javafx-fxml-11-win.jar define 1 overlapping classes: \n[WARNING]   - module-info\n[WARNING] javafx-controls-11-win.jar, javafx-controls-11-linux.jar define 1216 overlapping classes: \n[WARNING]   - com.sun.javafx.scene.control.TableColumnBaseHelper$TableColumnBaseAccessor\n[WARNING]   - javafx.scene.control.ComboBoxBase\n[WARNING]   - javafx.scene.control.skin.ColorPickerSkin$StyleableProperties$2\n[WARNING]   - com.sun.javafx.scene.control.inputmap.InputMap$KeyMappingInterceptor\n[WARNING]   - javafx.scene.control.cell.ChoiceBoxTreeTableCell\n[WARNING]   - javafx.scene.control.TableCell$3\n[WARNING]   - javafx.scene.control.skin.ProgressBarSkin$StyleableProperties$1\n[WARNING]   - javafx.scene.control.DialogPane$2\n[WARNING]   - javafx.scene.control.skin.ToolBarSkin$4\n[WARNING]   - javafx.scene.control.skin.ColorPickerSkin$3\n[WARNING]   - 1206 more...\n[WARNING] javafx-fxml-11-linux.jar, javafx-fxml-11-win.jar define 80 overlapping classes: \n[WARNING]   - com.sun.javafx.fxml.expression.ExpressionValue$KeyPathMonitor\n[WARNING]   - javafx.fxml.FXMLLoader$RootElement\n[WARNING]   - com.sun.javafx.fxml.expression.Expression$Parser$TokenType\n[WARNING]   - javafx.fxml.FXMLLoader$DefineElement\n[WARNING]   - javafx.fxml.Initializable\n[WARNING]   - javafx.fxml.FXMLLoader$ControllerMethodEventHandler\n[WARNING]   - com.sun.javafx.fxml.BeanAdapter\n[WARNING]   - javafx.fxml.FXMLLoader$ControllerAccessor$1\n[WARNING]   - javafx.fxml.JavaFXBuilderFactory$ObjectBuilderWrapper$ObjectBuilder\n[WARNING]   - javafx.fxml.FXML\n[WARNING]   - 70 more...\n[WARNING] maven-shade-plugin has detected that some class files are\n[WARNING] present in two or more JARs. When this happens, only one\n[WARNING] single version of the class is copied to the uber jar.\n[WARNING] Usually this is not harmful and you can skip these warnings,\n[WARNING] otherwise try to manually exclude artifacts based on\n[WARNING] mvn dependency:tree -Ddetail=true and the above output.\n[WARNING] See http://maven.apache.org/plugins/maven-shade-plugin/\n
Run Code Online (Sandbox Code Playgroud)\n

我一直在阅读其他帖子并查看一些视频,这似乎也发生在其他人身上,但对我来说看起来有点奇怪。同样奇怪的是,当我为 Windows 生成时,我在生成的 jar 中看不到任何 .dll 文件。

\n

有谁知道如何生成 FX 跨平台 jar?

\n

- - - - 编辑- - - -

\n

正如其他帖子中所建议的,我有一个 Launcher 类,它调用扩展 Application 的实际类:

\n
public class Launcher {\n    public static void main(String[] args) {\n        App.main(args);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

以及 JavaFX 类:

\n
public class App extends Application {\n\n    public static void main(String[] args) {\n        Application.launch();\n    }\n        \n    @Override\n    public void start(Stage stage) throws IOException {\n        ...\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我现在从pom中删除了配置文件,所以在编译时,maven应该获取所有依赖项(mac,linux和win),但仍然看起来它只是生成linux依赖项(我在linux上运行,我猜这有一些东西来处理它),因为如果我打开 jar 文件,我看不到任何 .dll 文件,并且它仍然无法在 Mac 上运行。这是我的完整 pom:

\n
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>org.log</groupId>\n    <artifactId>LogAnalyzer</artifactId>\n    <packaging>jar</packaging>\n    <version>1.0-SNAPSHOT</version>\n\n<properties>\n    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    <maven.compiler.source>11</maven.compiler.source>\n    <maven.compiler.target>11</maven.compiler.target>\n</properties>\n\n<dependencies>\n    <dependency>\n        <groupId>org.openjfx</groupId>\n        <artifactId>javafx-controls</artifactId>\n        <version>11</version>\n        <classifier>linux</classifier>\n    </dependency>\n    <dependency>\n        <groupId>org.openjfx</groupId>\n        <artifactId>javafx-fxml</artifactId>\n        <version>11</version>\n        <classifier>linux</classifier>\n    </dependency>\n    <dependency>\n        <groupId>org.openjfx</groupId>\n        <artifactId>javafx-controls</artifactId>\n        <version>11</version>\n        <classifier>mac</classifier>\n    </dependency>\n    <dependency>\n        <groupId>org.openjfx</groupId>\n        <artifactId>javafx-fxml</artifactId>\n        <version>11</version>\n        <classifier>mac</classifier>\n    </dependency>\n    <dependency>\n        <groupId>org.openjfx</groupId>\n        <artifactId>javafx-controls</artifactId>\n        <version>11</version>\n        <classifier>win</classifier>\n    </dependency>\n    <dependency>\n        <groupId>org.openjfx</groupId>\n        <artifactId>javafx-fxml</artifactId>\n        <version>11</version>\n        <classifier>win</classifier>\n    </dependency>\n    <dependency>\n        <groupId>org.apache.commons</groupId>\n        <artifactId>commons-csv</artifactId>\n        <version>1.6</version>\n    </dependency>\n    <dependency>\n        <groupId>org.junit.jupiter</groupId>\n        <artifactId>junit-jupiter-api</artifactId>\n        <version>5.7.0</version>\n        <scope>test</scope>\n    </dependency>\n    <dependency>\n        <groupId>org.hamcrest</groupId>\n        <artifactId>hamcrest</artifactId>\n        <version>2.2</version>\n        <scope>test</scope>\n    </dependency>\n</dependencies>\n\n<build>\n    <plugins>\n        <plugin>\n            <groupId>org.apache.maven.plugins</groupId>\n            <artifactId>maven-compiler-plugin</artifactId>\n            <version>3.8.0</version>\n            <configuration>\n                <release>11</release>\n            </configuration>\n        </plugin>\n        \n        <plugin>\n            <groupId>org.apache.maven.plugins</groupId>\n            <artifactId>maven-shade-plugin</artifactId>\n            <version>3.0.0</version>\n            <executions>\n                <execution>\n                    <phase>package</phase>\n                    <goals>\n                        <goal>shade</goal>\n                    </goals>\n                    <configuration>\n                        <transformers>\n                            <transformer\n                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">\n                                <manifestEntries>\n                                    <Main-Class>org.log.Launcher</Main-Class>\n                                </manifestEntries>\n                            </transformer>\n                        </transformers>\n                    </configuration>\n                </execution>\n            </executions>\n        </plugin>\n\n    </plugins>\n</build>\n
Run Code Online (Sandbox Code Playgroud)\n\n

mui*_*lpp 9

正如@jewelsea 评论中提供的链接之一所建议的,技巧是独立地显式添加每个平台的图形模块。

<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>11</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics</artifactId>
        <version>11</version>
        <classifier>win</classifier>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics</artifactId>
        <version>11</version>
        <classifier>linux</classifier>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics</artifactId>
        <version>11</version>
        <classifier>mac</classifier>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

它生成了一个 fat jar,我终于可以看到里面的 .dll 文件了。在linux和mac上都试过了,两个平台都可以用。