mui*_*lpp 7 java maven javafx-11
我似乎无法从 javaFX 应用程序生成跨平台构建。
\n当我从 IntelliJ 运行它时,它工作正常,如果通过 maven 打包它,我还可以在 Linux 上运行生成的 jar。
\n当我尝试在 Mac 上运行 jar 时出现问题,似乎不包含 JavaFX 库,然后我得到以下堆栈跟踪:
\nGraphics 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)\nRun 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>\nRun 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/\nRun Code Online (Sandbox Code Playgroud)\n我一直在阅读其他帖子并查看一些视频,这似乎也发生在其他人身上,但对我来说看起来有点奇怪。同样奇怪的是,当我为 Windows 生成时,我在生成的 jar 中看不到任何 .dll 文件。
\n有谁知道如何生成 FX 跨平台 jar?
\n- - - - 编辑- - - -
\n正如其他帖子中所建议的,我有一个 Launcher 类,它调用扩展 Application 的实际类:
\npublic class Launcher {\n public static void main(String[] args) {\n App.main(args);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n以及 JavaFX 类:
\npublic 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}\nRun 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>\nRun Code Online (Sandbox Code Playgroud)\n\n
正如@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上都试过了,两个平台都可以用。
| 归档时间: |
|
| 查看次数: |
2165 次 |
| 最近记录: |