返回 2. 添加 VM 选项解决
解决 M3 芯片 Mac 上 JavaFX 启动失败及 Assertion 错误
java
2024-12-13 17:58:22
解决 M3 芯片 Mac 上 JavaFX 启动失败并出现 'AssertionFailure' 错误的问题
在 M3 芯片的 Mac 上运行 JavaFX 程序时,可能会遇到 AssertionFailure
错误和 "java quit unexpectedly" 的提示。这个问题通常与 JavaFX 和 macOS 的兼容性以及 M3 芯片的架构有关。下面将分析可能的原因并提供解决方案。
1. 检查 JDK 和 JavaFX 版本兼容性
首先要确保使用的 JDK 版本与 JavaFX 兼容。某些 JDK 版本可能与特定版本的 JavaFX 存在兼容性问题,特别是在新的 M3 芯片架构上。
解决方案:
-
使用 Azul Zulu JDK : Azul Zulu JDK 提供了对 ARM64 架构的良好支持,并且通常与 JavaFX 配合良好。
- 操作步骤 :
- 从 Azul Zulu 官网下载适用于 macOS ARM64 架构的 JDK 版本: Azul Zulu Downloads
- 安装下载的 JDK。
- 在 IntelliJ IDEA 中配置项目 SDK,指向安装的 Zulu JDK。 (File -> Project Structure -> Project Settings -> Project -> SDK; and SDKs).
- 确保 Maven 或 Gradle 使用的是Zulu JDK。(可以根据 IDE 配置)
- 重新构建并运行项目。
- 操作步骤 :
-
使用 SDKMAN! 管理 JDK 版本: SDKMAN! 可以方便地安装、切换和管理多个 JDK 版本,可以尝试使用不同的 JDK 版本来测试兼容性。
-
安装 SDKMAN!:
curl -s "https://get.sdkman.io" | bash
-
安装 Azul Zulu JDK:
sdk install java 21.0.1-zulu
-
使用特定 JDK :
sdk use java 21.0.1-zulu
-
-
验证 JavaFX SDK:
确保在项目中正确引入了 JavaFX SDK。如果使用Maven,确保
pom.xml
中有正确的依赖配置。例如:<dependencies> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>21</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>21</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-graphics</artifactId> <version>21</version> <classifier>${os.detected.classifier}</classifier> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> <configuration> <mainClass>YourMainClass</mainClass> <jlinkImageName>YourAppName</jlinkImageName> <jlinkZipName>YourAppName</jlinkZipName> <jlinkExecutable>YourAppName</jlinkExecutable> <compress>2</compress> <stripDebug>true</stripDebug> <noHeaderFiles>true</noHeaderFiles> <noManPages>true</noManPages> <launcher>app</launcher> <jlinkModules> <jlinkModule>java.desktop</jlinkModule> <jlinkModule>javafx.base</jlinkModule> <jlinkModule>javafx.controls</jlinkModule> <jlinkModule>javafx.fxml</jlinkModule> <jlinkModule>javafx.graphics</jlinkModule> <jlinkModule>${module.name}</jlinkModule> </jlinkModules> <classifier>${os.detected.classifier}</classifier> </configuration> <dependencies> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-base</artifactId> <version>21</version> <classifier>${os.detected.classifier}</classifier> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-graphics</artifactId> <version>21</version> <classifier>${os.detected.classifier}</classifier> </dependency> </dependencies> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>21</source> <target>21</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.0</version> <executions> <execution> <goals> <goal>shade</goal> </goals> <phase>package</phase> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>YourMainClass</mainClass> </transformer> </transformers> <createDependencyReducedPom>false</createDependencyReducedPom> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.1</version> <configuration> <mainClass>YourMainClass</mainClass> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>YourMainClass</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <archive> <manifest> <mainClass>YourMainClass</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <appendAssemblyId>false</appendAssemblyId> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.7.1</version> <executions> <execution> <goals> <goal>detect</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
将
YourMainClass
替换为你的主类, 并根据你的项目情况修改依赖。 之后请更新你的 maven 依赖mvn clean install
.
2. 添加 VM 选项解决 NSTrackingRectTag
问题
NSTrackingRectTag
相关的错误通常与 JavaFX 在 macOS 上的事件处理有关。 可以尝试添加一些 VM 选项来解决这个问题。
解决方案:
-
在 IntelliJ IDEA 中配置 VM 选项:
-
操作步骤:
- 打开 "Run/Debug Configurations"。
- 选择你的应用程序配置。
3
-