使用 javafx 创建了一个非常简单的 gui,试图测试创建 javafx exe 的工作原理,从 eclipse 中提取了一个可运行的 jar 文件,但除非我使用 cmd 并添加 VM 参数 --module-path "" --否则该文件不会运行add-modules=javafx.controls,javafx.fxml,所以我尝试使用 launch4j 从该 jar 文件创建一个 exe,它会将我重定向到 java.com/downloads,所以我现在将 JRE bin 和 lib 文件夹与 exe 文件一起嵌入它根本不运行。 我是不是错过了什么或者做错了什么?
包装到原生容器中:
要将应用程序包装到 EXE 或 DEB 中,或者...,您不应该使用 launch4j,而应该使用“jpackage”。它是 Oracle 的官方工具,用于将 JAR 包装成 EXE 或 DEB,..并且包含在 JDK 17 LTS 中。它就像一个魅力。请注意:您的项目不必使用 JDK 17,也可以使用 JDK 11。
JFX 概况:
我无法告诉你为什么,但 JFX 不喜欢它,如果包含
main()
的类从另一个类扩展。我花了好几个小时才发现这一点。这可能听起来很愚蠢、不必要或类似,但我只能建议你这样做:
主课:
package com.wedasoft.FxMultiMessageSender;
public class FxMultiMessageSenderMain {
public static void main(String[] args) {
App.main(args);
}
}
JFX-应用程序起始类:
package com.wedasoft.FxMultiMessageSender;
public class App extends Application {
public static final String APPLICATION_NAME = "xxxxxxxx";
private Stage primaryStage;
private Scene primaryScene;
public static void main(String[] args) {
//createDatabase();
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
System.out.println("Starting " + APPLICATION_NAME);
}
}
不是真正有效的 JAR:
您的问题听起来像是您正在使用普通的 Java 项目并嵌入了 JFX 库。如果是这样,我只能建议你至少在 JFX 项目中使用 Maven 或 Gradle;没有他们之一你就不会快乐。
如果您使用 Maven,请尝试将您的 pom.xml 与以下 pom.xml 集成。您不需要指定任何 VM 参数。您需要在
<mainClass>com.wedasoft.FxMultiMessageSender.FxMultiMessageSenderMain</mainClass>
和 javafx-maven-plugin
中调整主类 maven-shade-plugin
。
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wedasoft</groupId>
<artifactId>FxMultiMessageSender</artifactId>
<version>0.0.2</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<javafx.version>17</javafx.version>
</properties>
<dependencies>
<!-- javafx -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-media</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-swing</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-web</artifactId>
<version>${javafx.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.8</version>
<executions>
<execution>
<!-- Default configuration for running -->
<!-- Usage: mvn clean javafx:run -->
<id>default-cli</id>
<configuration>
<mainClass>com.wedasoft.FxMultiMessageSender.FxMultiMessageSenderMain</mainClass>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.wedasoft.FxMultiMessageSender.FxMultiMessageSenderMain</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
使用 gradle 的 JavaFX 应用程序示例
https://github.com/davidweber411/SimpleJavaFxAppWithoutModules